2

次のようなタプルのリストがある場合:

L=[(('a','b','c','d'),2),(('f','e','d','a'),3)]

次のようなリストを作成したい:

L1=[['a','b','c','d'],['f','e','d','a']]

これは私がしたことです:

L1=[]

for item in L:
    for(letter,integer) in item:
        L1.append(list(letter))
        print(L1)

しかし、アンパックするには値が多すぎるというエラーが表示されます

私のコードの何が問題になっていますか?

4

5 に答える 5

9

ここで役立つのは、リスト内包表記です。

L1 = [list(letters) for (letters, number) in L]

これは、リスト内の各ペアを反復処理し、各ペアの文字タプルを取得してリストに変換します。次に、各結果を新しいリストの要素として保存します。

于 2012-11-26T01:50:09.190 に答える
2

あなたは試すことができます:

L1 = [list(i[0]) for i in L]
于 2012-11-26T01:51:42.070 に答える
2

あなたがした:

 for item in L:
      for(letter,integer) in item:
          L1.append(list(letter))
          print(L1)

ただし、itemすでにタプルであり、それを反復処理する必要はありません。あなたが欲しいのは

for letter, integer in L:
    L1.append(list(letter))

または...

for item in L:
    letter, integer = item
    L1.append(list(letter))
于 2012-11-26T01:49:15.223 に答える
1

あなたの問題はこの行にあります:

for(letter,integer) in item:

itemこれは、2 要素のタプルである を反復処理します。それを次のように置き換えます。

(letter,integer) = item

そして、それはうまくいきます。もちろん、それを行うためのもっと簡潔な方法がありますが、これで始めることができます。

于 2012-11-26T01:49:36.187 に答える
0

これを行うにはいくつかのオプションがあります。そのうちの1つは、最初の要素を取得してリストをマップすることです。このような:

>>> from operator import itemgetter
>>> map(list, map(itemgetter(0), L))
[['a', 'b', 'c', 'd'], ['f', 'e', 'd', 'a']]

もう1つは、リスト内包表記を使用することです。

>>> [list(item[0]) for item in L]
[['a', 'b', 'c', 'd'], ['f', 'e', 'd', 'a']]

またはラムダ:

>>> map(lambda x: list(x[0]), L)
[['a', 'b', 'c', 'd'], ['f', 'e', 'd', 'a']]

しかし、リストは必要ないかもしれませんが、タプルで十分です。このような場合、例はより単純です。

>>> from operator import itemgetter
>>> map(itemgetter(0), L)
[('a', 'b', 'c', 'd'), ('f', 'e', 'd', 'a')]
>>> [item[0] for item in L]
[('a', 'b', 'c', 'd'), ('f', 'e', 'd', 'a')]
>>> map(lambda x: x[0], L)
[('a', 'b', 'c', 'd'), ('f', 'e', 'd', 'a')]
于 2012-11-26T01:52:41.247 に答える