[Tutor] List and comprehension questions

Bob Gailer bgailer at alum.rpi.edu
Mon Feb 26 00:37:27 CET 2007


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



More information about the Tutor mailing list