1

リストのリストでレコードを見つけたいのですが、この場合は 3 で、前のレコードの要素 [2] で要素 [2] の減算を取得します

mylist = [
["acc", 2, 3.1,4.3,"pe"],
["fir", 1, 3.5,5.2,"p1"],
["sec", 3, 1.1,5.8,"pe"],
["set", 5, 6.2,6,2,"pa"],
["eve", 8, 5.4,5.7,"io"], 
["ewa", 3, 4.1,4.1,"po"]
]

結果は次のようになります。

3.5 - 1.1 および 5.2 - 5.8
5.4 - 4.1 および 5.7 - 4.1


このコードで取得できますが、より良い簡単な方法を学びたいと思います。ありがとうございます。

i=0    
while i<len(mylist)-1:
        if mylist[i][1] == 3:
            print mylist[i-1][2]-mylist[i][2]
            print mylist[i-1][3]-mylist[i][3]
        i+=1
4

3 に答える 3

1

while ループを使用する代わりに、for ループを使用できます。

for row1, row2 in zip(mylist[1:], mylist[0:-1]):
    if row1[1] == 3:
        print [y - x for x, y in zip(row1[2:4], row2[2:4])]

zipメソッドの代わりにizipメソッドを利用することで、メモリを節約することもできます。

from itertools import izip

for row1, row2 in izip(mylist[1:], mylist[0:-1]):
    if row1[1] == 3:
        print [y - x for x, y in izip(row1[2:4], row2[2:4])]

これらのコード スニペットは出力します

[2.4, -0.6]
[1.3, 1.6]

izip()リストの代わりにジェネレーターを使用します。これにより、スクリプトのパフォーマンスが向上し、メモリを節約できます。

上記のコードを短くしたい場合は、リスト内包表記を使用できます。

from itertools import izip
print [[y - x for x, y in izip(row1[2:4], row2[2:4])] for row1, row2 in izip(mylist[1:], mylist[:-1]) if row1[1] == 3]

出力:

[[2.4, -0.6], [1.3, 1.6]]

上記のジェネレーターを作成することもできます

for val in ([y - x for x, y in zip(row1[2:4], row2[2:4])] for row1, row2 in zip(mylist[1:], mylist[:-1]) if row1[1] == 3):
    print val

出力:

[2.4, -0.6]
[1.3, 1.6]

これを行うと、最後のアイテムにアクセスした後にジェネレーターが使い果たされることに注意してください。そのため、出力された値を保存する必要がある場合は、ジェネレーターを使用しないでください。

于 2013-11-14T15:48:48.280 に答える
0

簡潔な答え

for previous, current in zip(mylist[:-1], mylist[1:]):
    if current[1] == 3:
        print previous[2] - current[2]
        print previous[3] - current[3]

長い答え

私がやっていることは、最初の要素なしでリストを圧縮し、最後の要素なしでリストを圧縮することです:

>>> z = [10, 20, 30, 40, 50]
>>> z[:-1]
[10, 20, 30, 40]
>>> z[1:]
[20, 30, 40, 50]
>>> zip(z[:-1], z[1:])
[(10, 20), (20, 30), (30, 40), (40, 50)]

圧縮されたリストを反復処理することで、前の項目と現在の項目の両方に順番にアクセスできます。これは、for ループで変数に付けた名前から明らかです。

私のソリューションは、リストにゼロまたは1つのアイテムがある場合を適切に処理することに注意してください。これが発生すると、圧縮されたリストは空になるため、for ループは何もしません。

于 2013-11-14T16:06:21.817 に答える