2015-06-26 3 views
1

У меня есть четыре словаря одинаковой длины.Сравнение нескольких словарей с конкретными значениями

Я хочу:

  1. получить те ключи, которые подбираются между четырьмя.

  2. Итерации по определенному значению в каждом словаре, который я буду сравнивать позже и выполнить некоторые арифметические операции.

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

Я хочу, чтобы сделать это, не делая вложенный цикл:

d1 = {1:18:[['28','Y','N'],['108','A','M'],...] 
d2,d3 and d4 are the same thing expect different values but some will have same keys 
for k, v in di1.iteritems(): 
    for v1 in v: 
      for k2,v2 in di2.iteritems(): 
         for va2 in v2: 
          if k == k2: 
          for k3,v3 in di3.iteritems(): 
           for va3 in v3: 
           if k2 == k3: 
           for k4,v4 in di4.iteritems(): 
            for va4 in v4: 
            if k3==k4 and k==k4 and k==k3: 
             # do some arithmetics on dictionary's values for all four dictionaries 

Спасибо большого заранее.

+1

1-буквенные имена переменных делают ваш код запутанным. – stark

+0

Является ли d1 таким же, как di1? – stark

+0

Я не понимал этого: «Итерации по определенному значению в каждом словаре, который я буду сравнивать позже, и выполните некоторые арифметические операции». Что вы имеете в виду, пример, пожалуйста? –

ответ

1

если у них одинаковые ключи, то di1.keys() == di2.keys() == di3.keys() == di4.keys().

keys = di1.keys() 
for k in keys: 
    # do something with di1[k] di2[k] di3[k] di4[k] 

, если не все они имеют ключи, строить союзный набор ключей и проверить, какой ДИКТ имеет каждый ключ, используя in:

keys = set(di1.keys()) | set(di2.keys()) | set(di3.keys()) | set(di4.keys()) 
for k in keys: 
    if k in di1: 
     # di1 has the key 
    if k in di2: 
     # di2 has the key 
    if k in di1 and k in di2: 
     # do something with di1[k] and di2[k] 
    # ... 
+0

благодарит много, что было полезно. – BioInformatician

+0

@BioInformatician Добро пожаловать в SO! Поскольку вы новичок, вы можете проверить это [ссылка] (http://meta.stackexchange.com/a/5235/187716). – fferri

0

1) Я предполагаю, что «получить эти ключи которые сопоставляются между четырьмя «означает, что вы хотите найти ключи, которые присутствуют во ВСЕХ четырех словарях». Один из способов добиться этого - взять пересечение четырех ключей sets.

common_keys = set(d1.keys()) & set(d2.keys()) & set(d3.keys()) & set(d4.keys()) 

2) Итерация над общими ключами и «сделать некоторую арифметику по значениям словаря для всех четырех словарей»:

for key in common_keys: 
    for dict in [d1, d2, d3, d4]: 
     # do something with dict[key]... 

Вы также можете использовать списочные, если вы хотите, чтобы избежать вложенных циклов, например, сгенерировать список пар (ключ, список кортежей) и работать с ним позже:

common_keys_vals = [(key, [dict[key] for dict in [d1, d2, d3, d4]]) 
        for key in common_keys]