Я прохожу целый набор кортежей с many-many корреляцией, и я хочу сделать словарь, где каждый b (a, b) имеет список всего a's, которые соответствуют b. Это кажется неловким, чтобы протестировать на список в ключе b в словаре, затем искать a, затем добавить, если это уже не там, каждый раз через цикл переваривания кортежа; но я еще не нашел лучший путь. Каждый существует? Там некоторый другой путь состоит в том, чтобы сделать это, это намного более симпатично?
См. Документы для метода SetDefault ()
SetDefault ()
SetDefault (клавиша [, по умолчанию])
Если ключ В словаре верните его значение. Если нет, вставьте ключ со значением По умолчанию и вернуть по умолчанию. дефолт по умолчанию нет.
Вы можете использовать это как один вызов, который получит B, если он существует или устанавливает B в пустой список, если он еще не существует - и в любом случае, возврат B:
>>> key = 'b'
>>> val = 'a'
>>> print d
{}
>>> d.setdefault(key, []).append(val)
>>> print d
{'b': ['a']}
>>> d.setdefault(key, []).append('zee')
>>> print d
{'b': ['a', 'zee']}
комбинируют это с помощью простого » Не в «чеке, и вы сделали то, что вы после в трех строках»:
>>> b = d.setdefault('b', [])
>>> if val not in b:
... b.append(val)
...
>>> print d
{'b': ['a', 'zee', 'c']}
Предполагается, что вы на самом деле не связаны с списками, по умолчаниюДом и SET довольно удобно.
import collections
d = collections.defaultdict(set)
for a, b in mappings:
d[b].add(a)
Если вы Действительно нужны списки вместо наборов, вы можете следовать за этим с помощью
for k, v in d.iteritems():
d[k] = list(v)
, и если вы действительно нужны диктографически, вместо по умолчанию, вы можете сказать
d = dict(d)
Я действительно не вижу причин, по которой вы хотели бы, хотя.
Я не уверен, что вы выйдете из ключевого теста, но, как только они будут инициализированы ключ / значение Value, это легко :)
d = {}
if 'b' not in d:
d['b'] = set()
d['b'].add('a')
Набор будет гарантировать, что только 1 из «А» в коллекции. Вы должны сделать начальную проверку «b», хотя, чтобы убедиться, что ключ / значение существует.
Использование коллекций.defaultdict
your_dict = defaultdict(list)
for (a,b) in your_list:
your_dict[b].append(a)
Вместо использования , если
, afaik это больше Pythonic , чтобы использовать блок . Попробуйте блок
.
your_list=[('a',1),('a',3),('b',1),('f',1),('a',2),('z',1)]
your_dict={}
for (a,b) in your_list:
try:
your_dict[b].append(a)
except KeyError:
your_dict[b]=[a]
print your_dict
Вы можете отсортировать кортежи o (n log n), затем создайте словарь o (n)
или более простое o (n), но могут наложить тяжелую нагрузку на память в случае многих кортежей. :
your_dict = {}
for (a,b) in your_list:
if b in your_dict:
your_dict[b].append(a)
else:
your_dict[b]=[a]
Хм, это почти так же, как вы описали. Что такое неловко в этом?
Вы также можете рассмотреть возможность использования базы данных SQL, чтобы сделать грязную работу.