我需要能够根据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
将是唯一的。
我需要能够根据唯一dict
从此list
获得id
。我知道这可以通过使用循环来完成,但这看起来很麻烦,我觉得有一种明显的方法可以做到这一点,我没有看到由于脑融化。
答案 0 :(得分:70)
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
当循环未以else
语句结束时,将使用for
循环上的 break
子句。
答案 1 :(得分:17)
如果你必须多次这样做,你应该用你的列表创建一个由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)
答案 2 :(得分:1)
仅与iter()
一起为我工作:
my_item = next(iter(item for item in my_list if item['id'] == my_unique_id), None)
答案 3 :(得分:1)
之所以使用它,是因为与这里提供的其他一些解决方案相比,我的同事们可能更了解我在做什么。
[item for item in item_list if item['id'] == my_unique_id][0]
由于它是在测试中使用的,所以我认为额外的内存使用并不太重要(但是如果我错了,请纠正我)。就我而言,列表中只有8个项目。
答案 4 :(得分:0)
In [2]: test_list
Out[2]:
[{'id': 'an id', 'title': 'some value', 'value': 123.40000000000001},
{'id': 'another id', 'title': 'another title', 'value': 567.79999999999995},
{'id': 'yet another id', 'title': 'last title', 'value': 901.20000000000005}]
In [3]: [d for d in test_list if d["id"] == "an id"]
Out[3]: [{'id': 'an id', 'title': 'some value', 'value': 123.40000000000001}]
使用列表理解
答案 5 :(得分:0)
您可以为此创建一个简单的函数:
lVals = [{'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'}]
def get_by_id(vals, expId): return next(x for x in vals if x['id'] == expId)
get_by_id(lVals, 'an id')
>>> {'value': 123.4, 'title': 'some value', 'id': 'an id'}
答案 6 :(得分:0)
以防万一,如果您想根据字典的关键字进行查找。
my_item = next((item for item in my_list if item.has_key(my_unique_key)), None)