2016-06-13 4 views
2

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

from collections import defaultdict 
strings = ["val1", "val2", "val2", "val3"] 
my_dict = defaultdict(list) 

key = 0 
for string in strings: 
    if string not in my_dict.itervalues(): 
     my_dict[key].append(string) 
     key += 1 

print my_dict 

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

defaultdict(<type 'list'>, {0: ['val1'], 1: ['val2'], 2: ['val2'], 3: ['val3']})

«val2» не должны быть добавлены и он должен выглядеть следующим образом:

defaultdict(<type 'list'>, {0: ['val1'], 1: ['val2'], 2: ['val3']})

что я делаю неправильно?

+3

Предлагаю поиграть с простым r примеров. Попробуйте угадать результаты этих выражений: '1 в [1]' и '1 в [[1]] и' [1] в [[1]] '. Если вы можете определить шаблон, вы можете применить это знание к своей реальной проблеме. – Kevin

+0

Я не уверен, чего вы пытаетесь достичь в конце, и почему вы используете defaultdict для этого. Как насчет 'dedup = set (strings)' для удаления дубликатов, затем 'dict (zip (диапазон (len (dedup)), dedup))', чтобы сделать список словарем? – raphv

+0

Спасибо @Kevin, теперь я вижу, как это работает – GohanP

ответ

2

Обратите внимание, что my_dict.itervalues() возвращает список списков в вашем случае. Так string not in lists всегда возвращает True, как вы можете видеть из следующего кода,

>>> "val2" not in [["val1"], ["val2"]] 
True 

Чтобы получить желаемый результат, плоский список списков в список с помощью itertools.chain.from_iterable,

>>> import itertools 
>>> "val2" not in itertools.chain.from_iterable([["val1"], ["val2"]]) 
False 

полный исходный код для вашего дела,

from collections import defaultdict 
import itertools 

strings = ["val1", "val2", "val2", "val3"] 
my_dict = defaultdict(list) 

key = 0 
for string in strings: 
    if string not in itertools.chain.from_iterable(my_dict.values()): # flat a list of lists into a list 
     my_dict[key].append(string) 
     key += 1 

print(my_dict) 
# Output 
defaultdict(<type 'list'>, {0: ['val1'], 1: ['val2'], 2: ['val3']}) 
Смежные вопросы