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])]

最初のケースでは、リストには int のタプルが含まれています。2 番目のケースでは、リストのタプルが含まれており、リストはハッシュ可能ではありません。

最初のケースで、リストを含むシングルトン タプルが必要な場合は、 and を使用する必要がa = ([1],)ありb = ([2],)ます。そのように定義するaと、2 番目のケースのように失敗します。bset(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)[(1,2)] と [(3,4)] のように a と b のタプル変数のすべてのリストを変換します。

于 2012-10-05T08:55:09.387 に答える
0

あなたはこれを書くべきでした:

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