使用Python设置和压缩问题

时间:2012-10-04 23:06:31

标签: python python-3.x

使用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)

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

谢谢!

约翰

3 个答案:

答案 0 :(得分: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])]

在第一种情况下,列表包含一个int元组;在第二种情况下,它包含列表元组和列表不可清除。

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

答案 1 :(得分: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)]。

答案 2 :(得分:0)

你应该写下这个:

a = [1, 2]
b = [3, 4]