0

私はこの単純な仕事で立ち往生しています。リストのリストがあり、それを辞書に変換する必要がありますが、これまでのところ成功していません。

以下のコードで試してみましたが、KeyError:0が表示されます

list = [[3,0,7,4,5],[2,3,0,1,2],[6,6,7,6,6]]

d = {}
for x in list:
    i = 0
    for number in x:
        d[i].append(number)
        i += 1

私はそれがこのようである必要があります:

{0: [3,2,6], 1: [0,3,6], 2: [7,0,7], 3: [4,1,6], 4: [5,2,6]}

助けていただければ幸いです。よろしくお願いします。

4

2 に答える 2

4

enumerate補足として、 andzip関数を使用するだけでこれを行うことができます。

lst = [[3, 0, 7, 4, 5], [2, 3, 0, 1, 2], [6, 6, 7, 6, 6]]
d = dict(enumerate(zip(*lst)))
  • zip(*lst)基本的に転置関数です。Python 2のリスト、またはzipPython 3のオブジェクトを返します。これは、同等のリストに変換できます。

    [(3, 2, 6), (0, 3, 6), (7, 0, 7), (4, 1, 6), (5, 2, 6)]
    
  • enumerate()基本的には、その前の要素のインデックスをタックし、enumerateオブジェクトを返します。オブジェクトは、リストに変換されると、タプルのリストを返します。

    [(0, (3, 2, 6)), (1, (0, 3, 6)), (2, (7, 0, 7)), (3, (4, 1, 6)), (4, (5, 2, 6))]
    
  • dict()タプルのリストを取得し、それらをキーと値のペアに変換します。

    {0: (3, 2, 6), 1: (0, 3, 6), 2: (7, 0, 7), 3: (4, 1, 6), 4: (5, 2, 6)}
    
于 2013-02-24T03:11:35.167 に答える
2

ビルトインをIDとして使用しないでください。

>>> lst = [[3, 0, 7, 4, 5], [2, 3, 0, 1, 2], [6, 6, 7, 6, 6]]

KeyError初めて電話をかけるときは、次のようになります。

d[i].append(number)

これは、にキーがないためiですd。このコードを修正するのではなく、おそらくより「Pythonic」であるenumerate()andの使用を見てみましょう。zip()

>>> d = dict(enumerate(zip(*lst)))
>>> d
{0: (3, 2, 6), 1: (0, 3, 6), 2: (7, 0, 7), 3: (4, 1, 6), 4: (5, 2, 6)}

おそらく、これは新しいPythonユーザーにとっては少し気が遠くなるでしょう。分解させてください。

>>> zip(*lst)
[(3, 2, 6), (0, 3, 6), (7, 0, 7), (4, 1, 6), (5, 2, 6)]

これにより、リストがに解凍zip()され、3つの小さなリストが一緒に「圧縮」されます。

>>> enumerate(zip(*lst)

これにより、ペアのイテレータが返されます。各ペアは、インデックス(0から始まる)と入力からのアイテムです。

>>> dict(enumerate(zip(*lst)))

このdict()関数は、渡されたキーと値のペアで初期化された新しいディクショナリオブジェクトを返します。

于 2013-02-24T03:11:13.123 に答える