Python:根据dict中的内容从列表中获取一个dict

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将是唯一的.

我需要能够dictlist一个独特的基础上得到一个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_itemNone没有找到任何对象.它大致相同

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语句结束时,将使用循环子句.

  • @UGS如果您需要扫描整个列表并建立一个结果列表,而不仅仅是找到第一个匹配项,那么您将比列表理解更好,例如`[[m​​y_list中item的item,如果item ['id“] == my_unique_id]。 (2认同)

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)

  • `new_dict = dict((item ['id'],item)for initial_list中的item)`...为什么要创建一个中间列表然后`zip`? (3认同)

Rik*_*eek 7

我使用了这个,因为与此处提供的其他一些解决方案相比,我的同事可能更能够理解我这样做时发生的情况:

[item for item in item_list if item['id'] == my_unique_id][0]
Run Code Online (Sandbox Code Playgroud)

而且由于它是在测试中使用的,我认为额外的内存使用量并不是太大的问题(但如果我错了,请纠正我)。在我的例子中,列表中只有 8 项。