python - 未正确创建具有元组值的字典

时间:2017-12-19 16:38:03

标签: python set tuples

我已阅读this但似乎对我不起作用 -

>>> dict = {}
>>> dict[ "a" ] = set(("1111","test1"))
>>> dict
{'a': set(['1111', 'test1'])}
>>> dict[ "a" ].add( ("2222","test2"))
>>> dict
{'a': set(['1111', 'test1', ('2222', 'test2')])}

我也期待第一个看起来像一个元组 - 为什么会分裂?

我想做什么:

>>> for key,val_set in dict.items() :
...     for val in val_set :
...             print val
...
1111
test1
('2222', 'test2')

打印2件不是3件。

2 个答案:

答案 0 :(得分:5)

set()获取可迭代中的值,并分别添加每个值。你传入了一个元组,它是一个带有两个值的迭代。

如果你想添加元组本身,你需要将它包装在一个iterable中,如列表:

set([("1111","test1")])

在Python 3中,您可以使用集合显示来创建新集:

{("1111","test1")}

集合显示采用逗号分隔的元素,("1111", "test1")是这里的一个元组元素。

在另一篇文章中,该集是使用集合显示创建的(所以{tuple1, tuple2, etc.})并且答案使用itertools函数或generator expression来生成元组序列要处理的set()函数;两者都产生一个可迭代的类型。

答案 1 :(得分:2)

您已得到答案,但我建议您使用defaultdict。所有这些类型的案例(例如[(" 1111"," test1")])都得到妥善处理。您也不必担心初始化。

试试这个。

from collections import defaultdict
s = defaultdict(set)
s["a"].add(("pw", "sq"));
s["a"].add(("wq", "qq"));
s["a"].add(("aa", "bb"));

for k, v in s.items():
   print (k)
   for g in v:
       print (g)

请注意这一点,我假设你的所有价值都与你的钥匙相对应。 如果不是这种情况,请选择第一个。