Kent Johnson wrote: > Smith, Jeff wrote: > >> I'm getting use to using list iteration and comprehension but still have >> some questions. >> >> 1. I know to replace >> for i in range(len(list1)): >> do things with list1[i] >> with >> for li in list1: >> do things with li >> but what if there are two lists that you need to access in sync. Is >> there a simple way to replace >> for i in range(len(list1)): >> do things with list1[i] and list2[i] >> with a simple list iteration? >> > > Use zip() to generate pairs from both (or multiple) lists: > for i1, i2 in zip(list1, list2): > do things with i1 and i2 > > >> 2. I frequently replace list iterations with comprehensions >> list2 = list() >> for li in list1: >> list2.append(somefun(li)) >> becomes >> list2 = [somefun(li) for li in list1] >> but is there a similar way to do this with dictionaries? >> dict2 = dict() >> for (di, dv) in dict1.iteritems(): >> dict2[di] = somefun(dv) >> > > You can construct a dictionary from a sequence of (key, value) pairs so > this will work (using a generator expression here, add [] for Python < 2.4): > dict2 = dict( (di, somefun(dv) for di, dv in dict1.iteritems() ) > Missing )?
dict((di, somefun(dv)) for di, dv in dict1.iteritems()) > >> 3. Last but not least. I understand the replacement in #2 above is the >> proper Pythonic idiom, but what if a list isn't being created. Is it >> considered properly idiomatic to replace >> for li in list1: >> somefun(li) >> with >> [somefun(li) for li in list1] >> > > I think this is somewhat a matter of personal preference; IMO it is > ugly, I reserve list comps for when I actually want a list. > > Kent -- Bob Gailer 510-978-4454 _______________________________________________ Tutor maillist - [email protected] http://mail.python.org/mailman/listinfo/tutor
