1

申し訳ありませんが、私はPythonにかなり慣れていませんが、6つの個別のリストを取得して、リストのリストのように連結する必要がありました。

つまり、リスト A の a1 + リスト B の b1 + リスト C の c1 とリスト A の a2 + b2.... など

[[a1,b1,c1], [a2,b2,c2]...]

私はこれを試しました:

combList = [[0]*6]*len(lengthList)

for i in range(len(lengthList)):
    print i
    combList[i][0] = posList[i]
    combList[i][1] = widthList[i]
    combList[i][2] = heightList[i]
    combList[i][3] = areaList[i]
    combList[i][4] = perimList[i]
    combList[i][5] = lengthList[i]
    # i++
print combList

次に、代わりに追加したバリエーションを試しました:

    for i in range(len(lengthList)):
        print i
        combList[i][0].append(posList[i])
        combList[i][1].append(widthList[i])
        combList[i][2].append(heightList[i])
        combList[i][3].append(areaList[i])
        combList[i][4].append(perimList[i])
        combList[i][5].append(lengthList[i])
        # i++
    print combList

そこで、質問が 2 つあります。

なぜそれらのどちらもうまくいかなかったのですか、私の心の中では、それらが持つべきだったのです。そして、右下にi++を配置する必要はありませんか?なんらかの理由で機能しなかったので、トラブルシューティングを行いました。

以下の解決策を見つけましたが、上記の2つのコードで何が起こったのかを理解したいと思います。

for j in range(len(fNameList)):
            rows = [fNameList[j], widthList[j], heightList[j], areaList[j], perimeterList[j], lengthList[j]]
            print rows
            combList.append(rows)
        print combList
4

5 に答える 5

4

at you did の問題は、同じものへの 6 つの参照のリストを作成していることです。

[0]*6は、同じ番号 (ゼロ) への 6 つの参照のリストを[[0]*6]*len(lengthList)生成し、同じリストへの参照のリストを生成し[0]*6ます。

あなたが望む機能は次のとおりだと思いますzip

A = ['a1','a2','a3']
B = ['b1','b2','b3']
C = ['c1','c2','c3']

print [x for x in zip(A,B,C)]

与える:

[('a1', 'b1', 'c1'), ('a2', 'b2', 'c2'), ('a3', 'b3', 'c3')]

したがって、あなたの場合、これは機能します:

combList = [x for x in zip(fNameList, widthList, heightList, areaList, perimeterList, lengthList)]
于 2013-07-17T16:14:44.520 に答える
3

次のようにすると、すべて同じ 6 つのゼロのリストを指す名前のリストが作成されます。

combList = [[0]*6]*len(lengthList)

これは、次のことと同等です。

internal_list = [0] * 6
combList = [internal_list, internal_list, internal_list, internal_list, internal_list]

代わりに、 を使用zipすると、1 回のパスで必要なものを取得できます。

zipped_list = zip(posList, widthList, heightList, areaList, perimList, lengthList)
于 2013-07-17T16:15:12.337 に答える
3

a = [0]*66 つの参照を含むリストを定義します。これらの参照はすべて番号を指します。0

[a]*mmすべてが を指しているa、この場合はを参照するリストを定義します[0]*6

最後の例のコードは、既存のオブジェクトを繰り返し変更するのではなく、新しいオブジェクトへの参照を追加するため機能します。

他の人は を使用することを推奨zipしましたが、それは確かに最良の解決策です。

于 2013-07-17T16:15:37.820 に答える
1

リストがすべて同じ長さである場合、zip 全体を理解することでこれを行うことができます

[list(tup) for tup in zip (l1, l2, l3...)]
于 2013-07-17T16:18:36.717 に答える
1

Python のバージョンと 3 つのリストの大きさに応じて、 または のいずれかを使用する必要がありzipますizip

Python < 3 を実行している場合はizipzip (同様に使用できますが、リストが非常に大きい場合は、ジェネレーターの方がヒープ全体が高速で優れています)。

Python >= 3 を実行している場合はzip

from itertools import izip

zipped_list = izip(a,b,c)

for item in zipped_list:
    print item
>> (1, 1, 1)
>> (2, 2, 2)
>> (3, 3, 3)
>> (4, 4, 4)
>> (5, 5, 5)

そして、見栄えの良い Python を書く方法についてのちょっとした指導のために:

あなたが行ったループは、for i in range(len(lengthList)本当にPythonicに簡単に変換できます。

for item in lengthList:

今、あなたは「私のインデックスはどうですか、要素のインデックスにアクセスできません」と考えています。まあPythonにもそれに対する修正があり、enumerateと呼ばれ、次のように使用します。

for index, item in enumerate(lengthlist):

したがって、コードをより Pythonic な構文に変換します。

for index, element in enumerate(lengthList):
    combList[index][0].append(posList[index])
    combList[index][1].append(widthList[index])
    combList[index][2].append(heightList[index])
    combList[index][3].append(areaList[index])
    combList[index][4].append(perimList[index])
    combList[index][5].append(lengthList[index])
于 2013-07-17T17:06:56.717 に答える