Более питонический способ для вложенных циклов - PullRequest
0 голосов
/ 19 января 2019

У меня есть 2 для петель, которые работают, но они не слишком питонно выглядят.

РЕДАКТИРОВАТЬ: я понял, что упрощенный мой пример. Мне все еще нужны значения, соответствующие конкретному ключу.

Первый перебирает список словарей, а затем ключи и значения каждого словаря и печатает значение, если ключ равен «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 голосов
/ 19 января 2019
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]

Преобразование, выполненное в начале, должно быть выполнено только один раз (или не совсем, если данные правильно организованы с самого начала), чтобы получить супер быстрый и простой поиск данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...