嵌套循环的更多pythonic方法

时间:2019-01-19 17:45:43

标签: python list dictionary for-loop list-comprehension

我有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)

1 个答案:

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

在开始时进行的转换必须只执行一次(如果从头开始就正确地组织了数据,则根本不做),这样才能实现超快速便捷的数据查找。