268

私は20000のリストからなるリストを持っています。各リストの 3 番目の要素をフラグとして使用します。少なくとも 1 つの要素のフラグが 0 である限り、このリストに対していくつかの操作を実行したいのですが、次のようになります。

my_list = [["a", "b", 0], ["c", "d", 0], ["e", "f", 0], .....]

最初は、すべてのフラグが 0 です。while ループを使用して、少なくとも 1 つの要素のフラグが 0 かどうかを確認します。

def check(list_):
    for item in list_:
        if item[2] == 0:
            return True
    return False

check(my_list)が返された場合True、リストの作業を続けます。

while check(my_list):
    for item in my_list:
        if condition:
            item[2] = 1
        else:
            do_sth()

実際、my_list の要素を反復処理したときに削除したかったのですが、反復処理中にアイテムを削除することはできません。

元の my_list にはフラグがありませんでした:

my_list = [["a", "b"], ["c", "d"], ["e", "f"], .....]

要素を繰り返し処理するときに要素を削除できなかったので、これらのフラグを発明しました。しかし、my_listには多くの項目が含まれており、whileループは各ループでそれらすべてを読み取り、for多くの時間を消費します! 何か提案はありますか?

4

5 に答える 5

482

ここでの最良の答えall()は、この状況の組み込みである を使用することです。これをジェネレータ式と組み合わせて、必要な結果をクリーンかつ効率的に生成します。例えば:

>>> items = [[1, 2, 0], [1, 2, 0], [1, 2, 0]]
>>> all(flag == 0 for (_, _, flag) in items)
True
>>> items = [[1, 2, 0], [1, 2, 1], [1, 2, 0]]
>>> all(flag == 0 for (_, _, flag) in items)
False

all(flag == 0 for (_, _, flag) in items)は と直接同等であることに注意してくださいall(item[2] == 0 for item in items)。この場合、読みやすくなっています。

そして、フィルターの例では、リスト内包表記 (もちろん、必要に応じてジェネレーター式を使用できます):

>>> [x for x in items if x[2] == 0]
[[1, 2, 0], [1, 2, 0]]

少なくとも 1 つの要素が 0 であることを確認したい場合は、any()より読みやすい方を使用することをお勧めします。

>>> any(flag == 0 for (_, _, flag) in items)
True
于 2012-05-19T15:04:53.403 に答える
23

リスト内の項目が条件に違反しているかどうかを確認したい場合は、次のようにしますall

if all([x[2] == 0 for x in lista]):
    # Will run if all elements in the list has x[2] = 0 (use not to invert if necessary)

一致しないすべての要素を削除するには、次を使用しますfilter

# Will remove all elements where x[2] is 0
listb = filter(lambda x: x[2] != 0, listb)
于 2012-05-19T14:55:19.923 に答える
7

このように itertools の takewhile を使用できます。ステートメントが失敗する条件が満たされると停止します。反対の方法は dropwhile です

for x in itertools.takewhile(lambda x: x[2] == 0, list)
    print x
于 2012-05-19T14:54:07.593 に答える
0

別の使い方itertools.ifilter。これにより、真実性とプロセスがチェックされます ( を使用lambda)

サンプル-

for x in itertools.ifilter(lambda x: x[2] == 0, my_list):
    print x
于 2015-11-13T05:56:38.037 に答える