遍历包含一个键值的字典列表

2024-04-18 13:33:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望尽可能高效地遍历键值对列表。其目的是遍历数据集以找到包含与我要查找的代码对应的键的键值对,这是嵌套在另一个for循环中的,该循环遍历一组代码。 我的logos对象看起来像:

data_set = [{'key1': 'value'}, {'key2': 'value2'}, {'key3': 'value3'}, ]
codes = ['key1', 'key2', 'key3']

其中键对应于代码,值是我要提取的数据

for code in codes:
    data = ''
    for idx, data_obj in enumerate(data_set):
        for (key, value) in data_obj.items():
            if key == code:
                data = value
                break
        if data != '':
            del data_set[idx]
            break
    do_something_with_data(data)

目前我的方法运行良好,速度也相当快,但我不禁想知道是否有一种更干净/更快的方法


Tags: 数据代码inobjfordatavaluecode
3条回答

如果你有一个dict和你所有的键,这将是微不足道的,可以用dict.pop(key[,default])。你知道吗

在一个列表中的多个单键dict中有不相交的键是一个非常糟糕的数据结构选择-您应该将它们固定到一个大字典中,以使O(1)能够访问这些键,而不是随后将列表操纵成形状。你知道吗

具有多个键的dict的解决方案,如果这些键在您的代码列表中,它们将从dict中消失:

data_set = {'key1': 'value', 'key2': 'value2', 'key3': 'value3'} # use a dict
codes = ['key1', 'key2', 'key3']

for code in codes:
    data = data_set.pop(code, None) # get value & remove key, return None if not there
    if data:
        print(data) # do something with the data
print(data_set)

输出:

value
value2
value3
{}

从第三方获取数据时:

ds = [{'key1': 'value'}, {'key2': 'value2'}, {'key3': 'value3'}, ] 
data_set = { key:value for x in ds for key,value in x.items() }
print(data_set)

输出:

{'key1': 'value', 'key2': 'value2', 'key3': 'value3'} 

此解决方案使用列表理解作为总体O(n^2)解决方案:

data_set = [{'key1': 'value'}, {'key2': 'value2'}, {'key3': 'value3'}, ]
codes = ['key1', 'key2', 'key3']
new_data_set = [i for i in data_set if any(code in i for code in codes)]

输出:

[{'key1': 'value'}, {'key2': 'value2'}, {'key3': 'value3'}]

这会让事情加快一点

codes_set = set(codes)
values = [v for d in data_set for k, v in d if k in codes_set]

values应该是您要查找的值的列表。它肯定比您的版本快,因为它使用O(1)集查找

相关问题 更多 >