Python:根据字典中的某些内容从列表获取字典
我需要从一个 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'
}
]
注意: title
和 value
可以是任何值(甚至是相同的),而 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
语句结束时使用的。