Python リスト内の重複項目のインデックス位置を取得する方法を誰か知っていますか? これを試してみましたが、リスト内の項目の最初の出現のインデックスしか表示されません。
List = ['A', 'B', 'A', 'C', 'E']
私は次のことを望んでいます:
index 0: A
index 2: A
ベストアンサー1
オプションの 2 番目のパラメータを index に渡します。これは、index が検索を開始する場所です。各一致が見つかったら、このパラメータを、見つかった一致の直後の場所にリセットします。
def list_duplicates_of(seq,item):
start_at = -1
locs = []
while True:
try:
loc = seq.index(item,start_at+1)
except ValueError:
break
else:
locs.append(loc)
start_at = loc
return locs
source = "ABABDBAAEDSBQEWBAFLSAFB"
print(list_duplicates_of(source, 'B'))
プリント:
[1, 3, 5, 11, 15, 22]
defaultdict を使用して、任意のアイテムのすべての表示場所のリストを保持し、複数回表示されたアイテムを返すことで、単一のパススルー ソースで一度にすべての重複を見つけることができます。
from collections import defaultdict
def list_duplicates(seq):
tally = defaultdict(list)
for i,item in enumerate(seq):
tally[item].append(i)
return ((key,locs) for key,locs in tally.items()
if len(locs)>1)
for dup in sorted(list_duplicates(source)):
print(dup)
プリント:
('A', [0, 2, 6, 7, 16, 20])
('B', [1, 3, 5, 11, 15, 22])
('D', [4, 9])
('E', [8, 13])
('F', [17, 21])
('S', [10, 19])
同じソースに対してさまざまなキーを繰り返しテストする場合は、functools.partial を使用して、「部分的に完全な」引数リスト (つまり、シーケンスを指定しますが、検索する項目は省略します) を使用する新しい関数変数を作成できます。
from functools import partial
dups_in_source = partial(list_duplicates_of, source)
for c in "ABDEFS":
print(c, dups_in_source(c))
プリント:
A [0, 2, 6, 7, 16, 20]
B [1, 3, 5, 11, 15, 22]
D [4, 9]
E [8, 13]
F [17, 21]
S [10, 19]