假设我们有一个这样的字典列表:
mylist=[{'word':'bear','category':'animal'},
{'word':'lion','category':'animal'},
{'word':'ant','category':'insect'},
{'word':'ladybug','category':'insect'}]
我想选择具有'category':'animal'
的项目到一个新的列表中,就像我通常在模拟SQL: SELECT * FROM mylist WHERE 'category'='insect'
中所做的那样。
结果将是:
newlist=[{'word':'ant','category':'insect'},
{'word':'ladybug','category':'insect'}]
如何在Python 2.7中做到这一点?我知道我可以使用for
循环来做到这一点(每个人都知道:)),但我想有一个更干净的方法来做到这一点。
您可以使用带有"if"语句的列表推导式来快速完成此操作。
您的原始列表对象:
mylist=[{'word':'bear','category':'animal'},
{'word':'lion','category':'animal'},
{'word':'ant','category':'insect'},
{'word':'ladybug','category':'insect'}]
列表推导,创建新的列表对象,其中"category"键的值为"insect":
newlist = [dict for dict in mylist if dict["category"] == "insect"]
结果:[{'category': 'insect', 'word': 'ant'},
{'category': 'insect', 'word': 'ladybug'}]
列出的字典对象将自动按照键的字母顺序对自己排序,但答案在结构上仍然是相同的。我希望这对你有帮助!
使用列表推导式:
newlist = [item for item in mylist if item['category'] == 'insect']
这个循环遍历输入列表中的所有元素,只包括那些匹配if
表达式的元素。
>>> mylist=[{'word':'bear','category':'animal'},
... {'word':'lion','category':'animal'},
... {'word':'ant','category':'insect'},
... {'word':'ladybug','category':'insect'}]
>>> [item for item in mylist if item['category'] == 'insect']
[{'category': 'insect', 'word': 'ant'}, {'category': 'insect', 'word': 'ladybug'}]
>>> [item for item in mylist if item['category'] == 'animal']
[{'category': 'animal', 'word': 'bear'}, {'category': 'animal', 'word': 'lion'}]
>>> [item for item in mylist if item['word'] in ('bear', 'ladybug')]
[{'category': 'animal', 'word': 'bear'}, {'category': 'insect', 'word': 'ladybug'}]
试试这个
newlist=[x for x in mylist if x['category']=='animal']
这是一个没有显式编码for
循环的函数式解决方案。
定义一个函数,返回一个布尔值,将字典值与指定值进行比较。
import functools, pprint
def foo(d, key, value):
return d[key] == value
使用functools.partial
创建过滤器满足您的需求
# category filter
animal = functools.partial(foo, key = 'category', value = 'animal')
# word filter
ant = functools.partial(foo, key = 'word', value = 'ant')
在整个程序中使用过滤器:
pprint.pprint(filter(animal, mylist))
>>>
[{'category': 'animal', 'word': 'bear'},
{'category': 'animal', 'word': 'lion'}]
>>>
pprint(filter(ant, mylist))
>>>
[{'category': 'insect', 'word': 'ant'}]
>>>