Эффективный способ или создать список или добавить к нему, если Вы уже существуете?

Я прохожу целый набор кортежей с many-many корреляцией, и я хочу сделать словарь, где каждый b (a, b) имеет список всего a's, которые соответствуют b. Это кажется неловким, чтобы протестировать на список в ключе b в словаре, затем искать a, затем добавить, если это уже не там, каждый раз через цикл переваривания кортежа; но я еще не нашел лучший путь. Каждый существует? Там некоторый другой путь состоит в том, чтобы сделать это, это намного более симпатично?

40
задан user249228 12 January 2010 в 20:27
поделиться

6 ответов

См. Документы для метода 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']}
58
ответ дан 27 November 2019 в 01:28
поделиться

Предполагается, что вы на самом деле не связаны с списками, по умолчаниюДом и 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)

Я действительно не вижу причин, по которой вы хотели бы, хотя.

17
ответ дан 27 November 2019 в 01:28
поделиться

Я не уверен, что вы выйдете из ключевого теста, но, как только они будут инициализированы ключ / значение Value, это легко :)

d = {}
if 'b' not in d:
  d['b'] = set()
d['b'].add('a')

Набор будет гарантировать, что только 1 из «А» в коллекции. Вы должны сделать начальную проверку «b», хотя, чтобы убедиться, что ключ / значение существует.

0
ответ дан 27 November 2019 в 01:28
поделиться

Использование коллекций.defaultdict

your_dict = defaultdict(list)
for (a,b) in your_list:
    your_dict[b].append(a)
4
ответ дан 27 November 2019 в 01:28
поделиться

Вместо использования , если , 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
3
ответ дан 27 November 2019 в 01:28
поделиться

Вы можете отсортировать кортежи 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, чтобы сделать грязную работу.

3
ответ дан 27 November 2019 в 01:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: