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