[Tutor] List and comprehension questions

Kent Johnson kent37 at tds.net
Sun Feb 25 17:17:22 CET 2007


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() )

> 
> 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


More information about the Tutor mailing list