2012-01-03 2 views
0

Учитывая список словарей (каждый из которых имеют одинаковые ключи), я хочу, общее число различных значений, с которыми данный ключ, связанныйЧисло различных значений assoicated с ключом в списке dicts

$ li = [{1:2,2:3},{1:2,2:4}] $ в ожидаемый выход: {1: 1,2: 2}

Я придумал следующий фрагмент кода ... Есть ли лучший способ сделать это?

 counts = {} 
     values = {} 
     for i in li: 
     for key,item in i.items(): 
      try: 
       if item in values[key]: 
        continue 
      except KeyError: 
       else: 
        try: 
         counts[key] += 1 
        except KeyError: 
         counts[key] = 1 
        try: 
         values[key].append(item) 
        except KeyError: 
         values[key] = [item] 
+1

Ваш код недействителен. try..except и if..else смешаны. – yurib

+0

Не забудьте принять ответ, если вы хорошо поработали для вас. –

ответ

4

Нечто подобное, вероятно, более прямое:

from collections import defaultdict 

counts = defaultdict(set) 

for mydict in li: 
    for k, v in mydict.items(): 
    counts[k].add(v) 

Это заботится о сборном/подсчете значений. Чтобы отобразить их, как вы хотите их, это будет получить вас там:

print dict((k, len(v)) for k, v in counts.items()) 
# prints {1: 1, 2: 2} 
+0

спасибо..это чистый способ сделать :) – Graddy

+0

+1 для пифонического подхода – ChristopheD

0

Вы могли так что-то вроде этого:

li = [{1:2,2:3},{1:2,2:4}] 

def makesets(x, y): 
    for k, v in x.iteritems(): 
    v.add(y[k]) 
    return x 

distinctValues = reduce(makesets, li, dict((k, set()) for k in li[0].keys())) 
counts = dict((k, len(v)) for k, v in distinctValues.iteritems()) 
print counts 

При запуске этого печатает:

{1: 1, 2: 2} 

который является желаемым результатом.

0
counts = {} 
values = {} 

for i in li: 
    for key,item in i.items(): 
    if not (key in values.keys()): 
     values[key] = set() 
    values[key].add(item) 

for key in values.keys(): 
    counts[key] = len(values[key]) 
1

Вот еще одна альтернатива:

from collections import defaultdict 

counts = defaultdict(int) 
for k, v in set(pair for d in li for pair in d.items()): 
    counts[k] += 1 

И результат:

>>> counts 
defaultdict(<type 'int'>, {1: 1, 2: 2}) 
0

используя список в случае уплощение dicts не всегда одинаковы:

li=[{1: 2, 2: 3}, {1: 2, 2: 4}, {1: 3}] 
dic={} 
for i,j in [item for sublist in li for item in sublist.items()]: 
    dic[i] = dic[i]+1 if i in dic else 1 
Смежные вопросы