сделать новый диктат из поиска элементов в списке, которые находятся в существующем диктате - PullRequest
1 голос
/ 10 апреля 2020

У меня есть список значений mList = [1,6,7,9] и dict cDict = {1:[3,4,7], 2:[1,9], 3:[6,3]}

Я хочу отсканировать каждый элемент в dict (каждый список в dict), чтобы определить, является ли он элементом из mList. , Если элемент списка находится в элементах ключа dict, я хочу сделать так, чтобы значения сохранялись в новом dict, относящемся к ключам, в которых был найден элемент.

newDict = {1:[7], 2:[1,9], 3:[6]}

Я пробовал это:

newDict = {}
for i in mList:
    for k, v in cDict.items():
        if i in v:
            newDict[k].append(i)

, но получил следующую ошибку:

Runtime error 
Traceback (most recent call last):
  File "<string>", line 4, in <module>
KeyError: 2

Для устранения неполадок я попытался:

newDict = {}
for i in mList:
    for k, v in cDict.items():
        if i in v:
            print k, i

, и, кажется, он печатает нужные наборы:

2 1
3 6
1 7
2 9

Почему python говорит мне, что у меня ошибка ключа?

Ответы [ 2 ]

2 голосов
/ 10 апреля 2020

Если вы сделаете mList a set, вы можете воспользоваться intersection(), то есть операцией, которую вы выполняете здесь. Это также упрощает вещи:

mList = set([1,6,7,9])
cDict = {1:[3,4,7], 2:[1,9], 3:[6,3]}

newDict = {k:list(mList.intersection(v)) for k, v in cDict.items()}
# {1: [7], 2: [1, 9], 3: [6]}

Это дает дополнительное преимущество, заключающееся в том, что не возникает квадратичная сложность c, если списки становятся больше.

0 голосов
/ 10 апреля 2020

Проблема в том, что вы пытаетесь добавить в список, который еще не существует. Когда вы инициализируете свой словарь здесь: newDict = {}, python не может знать, что вы хотите, чтобы элементы в этом словаре были списками. Из-за этого, когда вы пытаетесь запустить эту строку: newDict[k].append(i), python не знает, что newDict[k] должен содержать список. Насколько знает компилятор, вы хотели использовать в качестве элементов только целые числа или строки.

Самое простое решение - каждый раз выполнять проверку нового списка, чтобы убедиться, что список для этого ключа уже был инициализируется. Если это не так, инициализируйте его:

newDict = {}
for i in mList:
    for k, v in cDict.items():
        if i in v:
            if k not in newDict:
                newDict[k] = []
            newDict[k].append(i)

Вы также можете попробовать defaultdict, но это, вероятно, не обязательно для этого варианта использования.

...