2016-06-13 9 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

私は単純な例。これらの式の結果を推測してみてください:[1]で1、[[1]]で[1]、[[1]]で[1]。パターンを識別できる場合は、この知識を実際の問題に適用することができます。 – Kevin

+0

私は最終的に何を達成しようとしているのか、なぜdefaultdictを使っているのかは分かりません。 'dict(zip(range(len(dedup))、dedup))'を削除するにはどうすれば 'dedup = set(strings)'を使ってリストを辞書にするのですか? – raphv

+0

@ケビンありがとうございました、今はどのように動作するのですか – GohanP

答えて

2

my_dict.itervalues()は、あなたのケースのリストを返します。次のコードから見ることができるようにstring not in lists常に

itertools.chain.from_iterableを使用して、リストに目的の結果、リストのフラットなリストを取得するには、

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

Trueを返し

>>> 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']}) 
関連する問題