is this pythonic?

MRAB google at mrabarnett.plus.com
Wed Jan 21 18:27:19 CET 2009


alex23 wrote:
> On Jan 22, 1:16 am, TP <Tribulati... at Paralleles.invalid> wrote:
>> Is the following code pythonic:
>>>>> l=[{"title":"to", "value":2},{"title":"ti","value":"coucou"}]
>>>>> dict = [ dict for dict in l if dict['title']=='ti']
>>>>> l.remove(*dict)
>>>>> l
>> [{'title': 'to', 'value': 2}]
> 
> Try not to use 'dict' or the name of any of the other built-in types
> as labels.
> 
> You're stepping through an entire list just to pass another list to
> l.remove to step through and remove items from...in fact, given that
> list.remove deletes the -first- occurance of the item, you're asking
> it to loop through -again- to find the matching element which you've -
> already- detected. A better and cleaner approach would be to step
> through the list -once- and remove the item when you find it:
> 
>     for index, record in enumerate(l):
>         if record['title'] == 'ti':
>             l.pop(index)
> 
[snip]
FYI, you shouldn't modify a list you're iterating over.

> Or you could just use a list comprehension:
> 
>     l = [d for d in l if d['title'] == 'ti']
> 
The for-loop was removing the item where there's a match, so the list 
comprehension in this case should keep the item where there _isn't_ a match:

l = [d for d in l if d['title'] != 'ti']

[remainder snipped]



More information about the Python-list mailing list