从字典列表中选择具有特定字段值的项(类似于SQL Select命令)



假设我们有一个这样的字典列表:

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'}]
>>> 

最新更新