2012-02-25 2 views
2

У меня есть словарь d наборов. При добавлении элемента под некоторым ключевым key я считаю два случая key in d и not key in d:Добавление элементов в словарь наборов

from random import randint 

for i in range(1000): 
    key = randint(0, 100) 

    if key in d: 
     d[key] |= set([randint(0, 10)]) 
    else: 
     d[key] = set([randint(0, 10]) 

Есть ли уборщик способ сделать это? Могу ли я объединить два случая?

ответ

6

Мне нравится, используя defaultdict, который является своего рода словарь, который создает объект по умолчанию, когда вы ссылаетесь на ключ, который еще не определен:

>>> from random import randint 
>>> from collections import defaultdict 
>>> 
>>> d = defaultdict(set) 
>>> 
>>> for i in range(10): 
...  el = randint(0, 5) 
...  d[el].add(randint(0,10)) 
... 
>>> d 
defaultdict(<type 'set'>, {0: set([2]), 1: set([7]), 2: set([8, 9, 5, 7]), 
3: set([1]), 4: set([1, 3, 4])}) 
>>> d[0] 
set([2]) 
>>> d[2] 
set([8, 9, 5, 7]) 
+0

Ниццы! Этого я очень хочу. – Randomblue

+0

@ Randomblue не забудьте принять его ответ! – smessing

+0

Gah прямо как я собирался отправить слишком lol – jdi

0

Попробуйте [defaultdict](http://docs.python.org/library/collections.html#collections.defaultdict) S: from collections import defaultdict

A defaultdict принимает параметр «default factory». В принципе, он позволяет установить значение по умолчанию для ключей, которые еще не были «инициализированы».

Так что в вашем примере вам не нужно будет делать проверку if el in d, если d является defaultdict. Несмотря на то, что проверка будет по-прежнему возвращать False, делая d[el] |= set([randint(0, 10)]) бы по существу приводит к следующему, если el не было уже в d:

d[el] = set([]) 
d[el] |= set([randint(0, 10)]) 

Надеется, что это помогает

+0

Первая часть предложения хорошая, но ему даже не нужно было создавать другой набор и добавлять его таким образом. Вы можете просто вызвать метод add() и сохранить накладные расходы. – jdi

+0

Я только имел в виду, что в качестве примера того, что происходит «под капотом». Я не рекомендую ему это делать. – inspectorG4dget

Смежные вопросы