2014-09-02 3 views
0

У меня есть словарь, как это:Элементов Словаря множеств в питоне

dict1 = {0: set([1, 4, 5]), 1: set([2, 6]), 2: set([3]), 3: set([0]), 4: set([1]), 5: set([2]), 6: set([])} 

и из этого словаря я хочу построить еще один словарь, сосчитать вхождение ключей в dict1 в любом другом значении, которое является результаты должны быть:

result_dict = {0: 1, 1: 2, 2: 2, 3: 1, 4: 1, 5: 1, 6: 1} 

Мой код был такой:

dict1 = {0: set([1, 4, 5]), 1: set([2, 6]), 2: set([3]), 3: set([0]), 4: set([1]), 5:set([2]), 6: set([])} 
result_dict = {} 
for pair in dict1.keys(): 
    temp_dict = list(dict1.keys()) 

    del temp_dict[pair] 
    count = 0 
    for other_pairs in temp_dict : 
     if pair in dict1[other_pairs]: 
      count = count + 1 
    result_dict[pair] = count 

проблема с этим кодом является то, что он очень медленный с большим набором данных. Другая попытка была в одной строке, например:

result_dict = dict((key ,dict1.values().count(key)) for key in dict1.keys()) 

, но это дает мне неправильные результаты, так как значения dict1 наборы:

{0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0} 

Большое спасибо заранее

+0

Этот код не запускается. 'dict1: {0: ...' недействителен синтаксис python. –

ответ

1

I предположим, что для первого удара я бы выяснил, какие значения имеются:

all_values = set().union(*dict1.values()) 

Тогда я бы попытаться подсчитать, сколько раз происходило каждое значение:

result_dict = {} 
for v in all_values: 
    result_dict[v] = sum(v in dict1[key] for key in dict1) 

Другой подход будет использовать collections.Counter:

result_dict = Counter(v for set_ in dict1.values() for v in set_) 

Это, вероятно, «чище», чем мой первый решение - но это связано с вложенным пониманием, которое может быть немного затруднено. Это действительно работает, однако:

>>> from collections import Counter 
>>> dict1 
{0: set([1, 4, 5]), 1: set([2, 6]), 2: set([3]), 3: set([0]), 4: set([1]), 5: set([2]), 6: set([])} 
>>> result_dict = Counter(v for set_ in dict1.values() for v in set_) 
+1

Большое вам спасибо. Второй подход работает отлично, но первый подход дает мне пустой набор с all_values, но когда я заменяю all_values ​​в цикле с помощью dict1.keys(), он дает те же результаты. –

+1

@RationalRose - извините, должен был использовать 'union' на первом шаге, а не' intersection'. D'о – mgilson

0

Просто создайте второй словарь, используя ключи от dict1, со значениями, инициированных в 0. Затем перебирайте значения в наборах dict1, увеличивая значения result_dict по мере того, как вы идете. Время выполнения: O (n), где n - это совокупное количество значений в наборах dict1.

dict1 = {0: set([1, 4, 5]), 1: set([2, 6]), 2: set([3]), 3: set([0]), 4: set([1]), 5:set([2]), 6: set([])} 
result_dict = dict.fromkeys(dict1.keys(), 0) 
# {0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0} 

for i in dict1.keys(): 
    for j in dict1[i]: 
     result_dict[j] += 1 

print result_dict 
# {0: 1, 1: 2, 2: 2, 3: 1, 4: 1, 5: 1, 6: 1} 
Смежные вопросы