我试图通过使用itertools.product
迭代多个集合来设置多个字典的默认值。当字典的键是元组时,这很有效。所以itertools.product
中的每个value
是一个元组,可以用作dict_x.setfault(value,[])
。当字典的键是单个值时,问题就出现了。
# example of problem
set_a = {1,2,3,4}
dict_y = {1:'blah',2:'blahblah'}
for key in itertools.product(set_a):
dict_y.setdefault(key,'hi')
print(dict_y)
# output: {1:'blah',2:'blahblah',(1,):'hi', (2,):'hi', (3,):'hi', (4,):'hi'}
所以键{1,2}不应该被用来在dict_y中设置为default。首选输出为{1:'blah',2:'blahblah',3:'hi', 4:'hi'}
我使用循环,查找,列表推导来迭代所有字典和设置默认值所需的集合。我没有明确的set_a
或dict_y
。因此,很难单独处理单值键的情况(如避免使用itertools)。如果:
setdefault for loop
中获得所需的key
将是有帮助的:- 有一种方法可以解压缩长度为1的元组或
- 从
dict_y[1] == dict_y[(1)] != dict_y[(1,)]
开始解包和打包元组 - 当
itertools.product
只有1个set作为输入参数时,防止获得元组
您的数据表示中可能存在一些歧义。第一段似乎建议首选的方法是使用带有键的字典基于元组。
如果是这种情况,那么下面的代码如何:
import itertools
set_a = {1,2,3,4}
dict_y = {(1,): 'blah', (2,): 'blahblah'}
for key in itertools.product(set_a):
dict_y.setdefault(key,'hi')
print(dict_y)
# {(1,): 'blah', (2,): 'blahblah', (3,): 'hi', (4,): 'hi'}
你的例子似乎是基于标量键。此代码将在这样的情况下工作一个case,根本不需要itertools.product
:
set_a = {1,2,3,4}
dict_y = {1: 'blah', 2: 'blahblah'}
for key in set_a:
dict_y.setdefault(key, 'hi')
print(dict_y)
# {1: 'blah', 2: 'blahblah', 3: 'hi', 4: 'hi'}