4

次のようなデータ構造があります。

[(1, 2), (2, 3), (4, 0), (5, 10), (6, 0), (7, 0)]

2 番目の要素が 0 であるリストの最後にあるタプルのみを除外する最良の方法は何ですか?

望ましい出力は次のとおりです。

[(1, 2), (2, 3), (4, 0), (5, 10)]
4

4 に答える 4

8

rstrip()これは、「リスト用」が必要なように思えます。.pop()while ループで使用できます。

while somelist and somelist[-1][1] == 0:
    somelist.pop()

これにより、リストがその場で変更されます。

コピーを作成するには、最初にスライスのエンドポイントを見つけてから、そのポイントまでスライスして簡単にコピーする必要があります。

end = len(somelist)
while end and somelist[end - 1][1] == 0:
    end -= 1
newlist = somelist[:end]
于 2013-03-29T01:28:37.517 に答える
1
In [355]: list(reversed(list(dropwhile(lambda x: x[1]==0, reversed([(1, 2), (2, 3), (4, 0), (5, 10), (6, 0), (7, 0)])))))
Out[355]: [(1, 2), (2, 3), (4, 0), (5, 10)]
于 2013-03-29T01:38:50.320 に答える
1

インプレースには@MartijnPietersによるソリューションを好みます

>>> L = [(1, 2), (2, 3), (4, 0), (5, 10), (6, 0), (7, 0)]
>>> i = next((i for i, (x, y) in enumerate(reversed(L)) if y != 0), 0)
>>> L[:-i]
[(1, 2), (2, 3), (4, 0), (5, 10)]
于 2013-03-29T02:58:42.357 に答える
0

あなたの質問により、2 番目の値が 0 の要素のみを削除したいと解釈しました。意図していない場合は、申し訳ありません。これを行うことができます(リストを永久に変更したい場合):

myList = [(1, 2), (2, 3), (4, 0), (5, 10), (6, 0), (7, 0)]
for i in range(len(myList)):
    if myList[i][1] == 0:
        del myList[i]
return myList

リストを変更したくない場合は、次のようにします。

myList = [(1, 2), (2, 3), (4, 0), (5, 10), (6, 0), (7, 0)]
afterList = []
for i in myList:
    if i[1] != 0:
        afterList.append(i)
return afterList
于 2013-03-29T01:26:21.337 に答える