Проверка того, совпадают ли значения обоих defaultdict для одних и тех же ключей - PullRequest
0 голосов
/ 06 апреля 2019

У меня есть два defaultdicts, и, по сути, я хочу посмотреть, совпадают ли значения в обоих словарях для одинаковых соответствующих ключей. Например: {1,4} {1,4}. Таким образом, он ищет совпадающие ключи 1, а затем проверяет, соответствуют ли их значения 4, что он делает.

Так что в моем случае у меня есть:

keyOne = [30, 30, 60, 70, 90]
valueOne = [3, 4, 6, 7, 0]

KeyTwo = [30, 30, 60, 70, 90]
valueTwo = [4, 5, 6, -10, 9]

Я создаю два defaultdicts как таковых:

one = defaultdict(list)
for k, v in zip(keyOne, valueOne):
   one[k].append(v)

two = defaultdict(list)
for k, v in zip(keyTwo, valueTwo):
   two[k].append(v)

Затем я хочу добавить записи, где ключи совпадают, но значения не совпадают - поэтому я пишу это, но это не работает:

three = defaultdict(list)

for k,v in one.items():
  for key in k:
    if key in two.items():
      if (value != v):
        three[k].append(value)

Я не уверен, где я иду не так, и это будет много значить, если кто-то может помочь мне исправить это. Я новичок в программировании и очень хочу учиться

1 Ответ

0 голосов
/ 06 апреля 2019

Вы получили опечатку и можете упростить цикл:

from collections import defaultdict

keyOne = [30, 30, 60, 70, 90]
valueOne = [3, 4, 6, 7, 0]

keyTwo = [30, 30, 60, 70, 90]   # typo KeyTwo
valueTwo = [4, 5, 6, -10, 9] 

one = defaultdict(list)
for k, v in zip(keyOne, valueOne):
   one[k].append(v)

two = defaultdict(list)
for k, v in zip(keyTwo, valueTwo):
   two[k].append(v)
three = defaultdict(list)

for k1,v1 in one.items():   # there is no need for a double loop if you just want
    v2 = two.get(k1)        # to check the keys that are duplicate - simply query
    if v2:                  # the dict 'two' for this key and see if it has value
        three[k1] = [value for value in v2 if value not in v1]

    # delete key again if empty list (or create a temp list and only add if non empty)
    if not three[k1]:
        del three[k1]

print(three)

Вывод:

# all values in `two` for "keys" in `one` that are not values of `one[key]`
defaultdict(<class 'list'>, {30: [5], 70: [-10], 90: [9]})

Использование dict.get(key) возвращает Noneесли ключ отсутствует в словаре и исключает проверку if перед поиском.Впрочем, потом вам все еще нужен if - но я думаю, что этот код "чище".

См. Почему dict.get (ключ) вместо dict [ключ]?

...