我有2个for循环正在工作,但它们看起来不太像pythonic。
编辑:我意识到这简化了我的示例。我仍然需要与特定键对应的值。
第一个循环浏览字典列表,然后循环浏览每个字典的键和值,如果键等于“ MATCH”,则打印该值。
第二个循环遍历相同的词典列表和不同的词典。如果第一个词典列表中的值等于第二个词典的键,则它会再次遍历词典列表,并在键等于“ MATCH”时打印该值。
for item in data_dict:
for k, v in item.items():
if k == 'MATCH':
print(v)
for item in data_dict:
for k, v in item.items():
for kx, vx in dictA.items():
if v == kx:
for k2, v2 in item.items():
if k2 == 'MATCH':
print(v2)
答案 0 :(得分:2)
for item in data_dict:
for k, v in item.items():
if k == 'MATCH':
print('found')
您没有正确使用dict,只是将其用作元组列表。只需写:
for item in data_dict:
if 'MATCH' in item:
print('found: ',item['MATCH'])
# break here? not if you want multiple matches
相同的另一个循环。但是我只是将复杂度从O(n**2)
降低到O(n)
。您仍然在字典列表中执行线性搜索,仍然不尽人意。
另一种方法是:创建一个以元素列表作为元素的字典,而不是带有元素列表的字典。
这样一来,您就可以通过1键查找获得所有信息。实际示例:
假设您的数据如下所示:
list_of_dicts = [
{'MATCH':12, 'foo':14},
{'MATCH':5, 'bar':2},
{'what':0}
]
使用collections.defaultdict(list)
将其转换为列表的字典:
import collections
dict_of_lists = collections.defaultdict(list)
for d in list_of_dicts:
for k,v in d.items():
dict_of_lists[k].append(v)
让我们看看新的字典:
>>> dict_of_lists
{'MATCH': [12, 5],
'bar': [2],
'foo': [14],
'what': [0]}
完成此操作后,只需获取与此键匹配的所有值即可
if 'MATCH' in dict_of_lists:
print(dict_of_lists['MATCH'])
打印:
[12, 5]
在开始时进行的转换必须只执行一次(如果从头开始就正确地组织了数据,则根本不做),这样才能实现超快速便捷的数据查找。