List comprehension vs filter()

Steven D'Aprano steve+comp.lang.python at pearwood.info
Wed Apr 20 06:16:17 EDT 2011


On Wed, 20 Apr 2011 13:10:21 +1000, Chris Angelico wrote:

> Context: Embedded Python interpreter, version 2.6.6
> 
> I have a list of dictionaries, where each dictionary has a "type"
> element which is a string. I want to reduce the list to just the
> dictionaries which have the same "type" as the first one.

[snip discussion and code]

It should, and does, work as expected, both in the global scope:


>>> lst = [{"type": "calc"}, {"type": "fixed"}, {"type": "spam"}, 
...        {42: None, "type": "CALC"}]
>>> t = lst[0]["type"].lower()
>>> 
>>> filter(lambda x: x["type"].lower() == t, lst)
[{'type': 'calc'}, {42: None, 'type': 'CALC'}]
>>> [i for i in lst if i["type"].lower() == t]
[{'type': 'calc'}, {42: None, 'type': 'CALC'}]

and in a function:

>>> def test():
...     lst = [{"type": "calc"}, {"type": "fixed"}, {"type": "spam"},
...            {42: None, "type": "CALC"}]
...     t = lst[0]["type"].lower()
...     print filter(lambda x: x["type"].lower() == t, lst)
...     print [i for i in lst if i["type"].lower() == t]
...
>>> test()
[{'type': 'calc'}, {42: None, 'type': 'CALC'}]
[{'type': 'calc'}, {42: None, 'type': 'CALC'}]


[...]
> If I use the filter() method, the resulting list is completely empty. If
> I use the list comprehension, it works perfectly. Oddly, either version
> works in the stand-alone interpreter.

Let me guess... you're using an IDE?

There's your problem. IDEs often play silly buggers with the environment 
in order to be "clever". You've probably found a bug in whatever IDE 
you're using.

And this is why I won't touch the buggers with a 30 ft pole, at least not 
for anything serious.



-- 
Steven



More information about the Python-list mailing list