通过包含一个键值对的字典列表迭代



我想尽可能有效地通过键值对的列表进行迭代。目的是迭代数据集,以找到包含与我要找到的代码相对应的密钥对的键值对,这嵌套在另一个循环中,该循环通过一组代码迭代。我的徽标对象看起来像:

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)

目前我的方法工作正常,很快,但是我不禁要问是否没有更清洁/更快的方法

如果您拥有一个 dict具有所有键,这将是微不足道的,并且可以用dict.pop(key [,默认](完成。

在列表中的几个1键命令中有分离的键是数据结构的非常糟糕的选择 - 您应该将它们固定成一个大词典,以使o(1(启用键,而不是将列表操作成形。

使用多个键的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'} 

这应该加快速度

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

values应该是您要寻找的值列表。它绝对比您的版本快,因为它使用O(1(Set Lookup

此解决方案对整个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'}]

最新更新