我有一个默认字典。我遍历许多字符串并将它们作为数字添加到键下的目录中,但前提是字典中没有该值。所以我的代码看起来像这样:
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']})
我做错了什么?
请注意,在您的案例中,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']})