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

时间:2011-08-16 13:53:25

标签: python performance list dictionary

我需要能够根据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将是唯一的。

我需要能够根据唯一dict从此list获得id。我知道这可以通过使用循环来完成,但这看起来很麻烦,我觉得有一种明显的方法可以做到这一点,我没有看到由于脑融化。

7 个答案:

答案 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)