リストから背中合わせの重複を検出しようとしています。私は異なる重複検出を試みましたが、私はリストをクロールして重複しているものを検出することができませんでした。リストから重複した要素を連続して検出するにはどうすればよいですか?
[1,1,2,4,5,6,5]
のみ1
が発見されなければならない必要がある、5
はいけません。
リストから背中合わせの重複を検出しようとしています。私は異なる重複検出を試みましたが、私はリストをクロールして重複しているものを検出することができませんでした。リストから重複した要素を連続して検出するにはどうすればよいですか?
[1,1,2,4,5,6,5]
のみ1
が発見されなければならない必要がある、5
はいけません。
あなたは可能性があり最後に見た値を記録し、現在の値と同じ場合は新しいリストに追加します:
これらの両方が何度も重複以上を追加することをduplicates = [
item
for previous, item in zip(numbers, numbers[1:]
if previous == item
]
注:
duplicates = []
for previous, item in zip(numbers, numbers[1:]):
if previous == item:
duplicates.append(item)
同等list comprehension:210
numbers = [1,1,2,4,5,6,5]
duplicates = []
previous = None
for n in numbers:
if n == previous:
duplicates.append(n)
previous = n
また、あなたループとして、前の項目を表示するzip
を使用して、リストをスライスできそれらが連続して複数回出現する場合。
隣接する重複を見つけるには、アイテムのリストを繰り返し、現在のものと次のものを比較できます。
items = [1, 1, 2, 4, 5, 6, 5]
for i, item in enumerate(items):
# don't compare last item to avoid going out of range
if i < len(items) - 1:
if item == items[i + 1]:
print 'duplicate found', item, items[i + 1]
これは、ループから最後の項目を削除することによってさらに最適化できます。これにより、最後の項目にないことを確認するために、if
のチェックを行う必要がなくなります。
items = [1, 1, 2, 4, 5, 6, 5]
for i, item in enumerate(items[:-1]):
if item == items[i + 1]:
print 'duplicate found', item, items[i + 1]
連続で繰り返される値が発見されなければならないならば、私はitertools.groupby
使用したい:
items = [1,1,2,4,5,6,5]
[g for g, l in itertools.groupby(items) if len(list(l)) > 1]
他の方法をあなたのリストをビュンと隣接する値を比較することができます
[e1 for e1, e2 in zip(items, items[1:]) if e1 == e2]