web-dev-qa-db-ja.com

利回りジェネレータを使用してリストから連続する重複を削除しますか?

私はジェネレータを使用してリストを圧縮しようとしています:

[1, 1, 1, 1, 2, 2, 2, 1, 1, 1] == [1, 2, 1]

[5, 5, 5, 4, 5, 6, 6, 5, 5, 7, 8, 0, 0])) == [5, 4, 5, 6, 5, 7, 8, 0]

1番目と2番目の要素が等しいかどうかをチェックし、2番目と3番目の要素をチェックし、「4に達したとき」と等しくならないようにして「5」を生成するジェネレータを使用してみました。 「4」

コード

test = [5, 5, 5, 4, 5, 6, 6, 5, 5, 7, 8, 0, 0] # sample list
from typing import Iterable
def compress(items: list) -> Iterable:

    x = 0
    while items[x] == items[x + 1]:
        x += 1
    yield items[x]


ans = compress(test)
for x in ans:
    print(ans)

しかし、私は続けます

ジェネレーターオブジェクトは0x00000254D383C820で圧縮します。なぜループしないのですか?

next()を試して使用すると、最大で5になり、他の数値をチェックしません。

どんな援助も大歓迎です。

4
bienology

もう1つの解決策:リストと同じリストを1つずつ(つまり、連続するアイテムのペアで)シフトして、最初の(前の)アイテムが2番目のアイテムと異なる各ペアから2番目のアイテムを選択します(次)アイテム:

l = [5, 5, 5, 4, 5, 6, 6, 5, 5, 7, 8, 0, 0]
[l[0]] + [y for x,y in Zip(l, l[1:]) if x!=y]
#[5, 4, 5, 6, 5, 7, 8, 0]

ちなみに、これはこれまでに提示された最速のソリューションの1つです。

2
DYZ

えっと、私はどこかからこの質問を認識しています。 ;)

私はそれをあなたとは違う方法で行ったが、あなたがそれをのぞき見ることが役に立つと思うかもしれないと思った:

def compress(i:list):
    return[i[x]for x in range(len(i))if x==0 or i[x-1]!=i[x]]

他の回答はあなたの質問の詳細によく適合します。私はたまたまセットアップを認識し、私が掘り下げて、この非常に同じ問題に与えた解決策を提供すると考えました。乾杯!

2
Jon Red