joh*_*eth 47 python performance dictionary list
我需要能够根据其中的某个值在list(在这种情况下是一个项目)中找到一个项目.我需要处理的结构如下所示:dictdictlist
[
{
'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'
}
]
Run Code Online (Sandbox Code Playgroud)
注意事项: title并且value可以是任何值(并且相同),id将是唯一的.
我需要能够dict从list一个独特的基础上得到一个id.我知道这可以通过使用循环来完成,但这看起来很麻烦,我觉得有一种明显的方法可以做到这一点,我没有看到由于脑融化.
agf*_*agf 80
my_item = next((item for item in my_list if item['id'] == my_unique_id), None)
Run Code Online (Sandbox Code Playgroud)
这将遍历列表,直到找到第一个匹配项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
Run Code Online (Sandbox Code Playgroud)
elsefor当循环未通过break语句结束时,将使用循环子句.
Céd*_*ien 18
如果你必须多次这样做,你应该用你的列表重新创建一个由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'}
}
Run Code Online (Sandbox Code Playgroud)
或者按照agf建议的单行方式:
new_dict = dict((item['id'], item) for item in initial_list)
Run Code Online (Sandbox Code Playgroud)
我使用了这个,因为与此处提供的其他一些解决方案相比,我的同事可能更能够理解我这样做时发生的情况:
[item for item in item_list if item['id'] == my_unique_id][0]
Run Code Online (Sandbox Code Playgroud)
而且由于它是在测试中使用的,我认为额外的内存使用量并不是太大的问题(但如果我错了,请纠正我)。在我的例子中,列表中只有 8 项。
| 归档时间: |
|
| 查看次数: |
35647 次 |
| 最近记录: |