5

不知道为什么这个在使用 set 和 zip 时有效:

>>> a = ([1])
>>> b = ([2])
>>> set(zip(a,b))
{(1, 2)}

但是这个没有?

>>> a = ([1],[2])
>>> b = ([3],[4])
>>> set(zip(a,b))
Traceback (most recent call last):
  File "<pyshell#21>", line 1, in <module>
    set(zip(a,b))
TypeError: unhashable type: 'list'

期望的结果 (1,3) (2,4)

这样做的正确方法是什么?

谢谢!

约翰

4

3 回答 3

9

如果我们查看zip输出会更有意义:

>>> a = ([1]) # equivalent to [1], not a tuple
>>> b = ([2]) # equivalent to [2], not a tuple
>>> list(zip(a,b))
[(1, 2)]

>>> a = ([1],[2])
>>> b = ([3],[4])
>>> list(zip(a,b))
[([1], [3]), ([2], [4])]

在第一种情况下,列表包含一个整数元组;在第二种情况下,它包含列表元组并且列表不可散列。

在第一种情况下,如果你想要一个包含列表的单例元组,你应该使用a = ([1],)and b = ([2],)。如果您以这种方式定义ab那么set(zip(a, b))将像在第二种情况下一样失败。

于 2012-10-04T23:10:31.153 回答
1

您可以执行这样的操作,然后获得所需的输出。

a = ([1],[2])
b = ([3],[4])
zip(zip(*a),zip(*b))[0]

像这样 ((1, 2), (3, 4))。

zip(*a)转换 a 和 b 元组变量中的所有列表,如 [(1,2)] 和 [(3,4)]。

于 2012-10-05T08:55:09.387 回答
0

你应该这样写:

a = [1, 2]
b = [3, 4]
于 2012-10-04T23:09:06.903 回答