Python:根据字典中的某些内容从列表获取字典

99 投票
8 回答
102680 浏览
提问于 2025-04-16 23:41

我需要从一个 list 中找到一个项目(在这里这个项目是一个 dict),这个查找是根据 dict 中的某个值来进行的。我要处理的 list 的结构大致是这样的:

[
    {
        'title': 'some value',
        'value': 123.4,
        'id': 'an id'
    },
    {
        'title': 'another title',
        'value': 567.8,
        'id': 'another id'
    },
    {
        'title': 'last title',
        'value': 901.2,
        'id': 'yet another id'
    }
]

注意: titlevalue 可以是任何值(甚至是相同的),而 id 是唯一的。

我需要根据唯一的 id 从这个 list 中获取一个 dict。我知道可以通过循环来实现这个功能,但这样做感觉有点麻烦。我觉得应该有一种更简单的方法可以做到这一点,只是我现在脑袋有点混乱,看不出来。

8 个回答

8

我用了这个方法,因为我觉得我的同事们可能更容易理解我在做什么,而不是用这里提供的其他一些解决方案:

[item for item in item_list if item['id'] == my_unique_id][0]

而且因为这是在测试中用的,我觉得额外的内存使用量不是太大的问题(但如果我错了,请纠正我)。在我的例子中,列表里只有8个项目。

31

如果你需要多次执行这个操作,建议你用一个列表来重新创建一个以id为索引的字典:

keys = [item['id'] for item in initial_list]
new_dict = dict(zip(keys, initial_list)) 

>>>{
    'yet another id': {'id': 'yet another id', 'value': 901.20000000000005, 'title': 'last title'}, 
    'an id': {'id': 'an id', 'value': 123.40000000000001, 'title': 'some value'}, 
    'another id': {'id': 'another id', 'value': 567.79999999999995, 'title': 'another title'}
}

或者你也可以用agf建议的单行代码来实现:

new_dict = dict((item['id'], item) for item in initial_list)
161
my_item = next((item for item in my_list if item['id'] == my_unique_id), None)

这段代码会遍历列表,直到找到第一个与 my_unique_id 匹配的项目,然后就停止了。它不会在内存中存储任何中间列表(因为使用了生成器表达式),也不需要显式的循环。若没有找到任何对象,它会把 my_item 设置为 None。这大致上和下面的代码是一样的:

for item in my_list:
    if item['id'] == my_unique_id:
        my_item = item
        break
else:
    my_item = None

for 循环中的 else 子句是在循环没有被 break 语句结束时使用的。

撰写回答