3

多くの重複を含むリストがあります。配列内のすべての重複のインデックスを見つけるにはどうすればよいですか。したがって、基本的にはデータ項目を検索し、重複があるかどうかを調べます。重複がある場所を含む、アイテムが見つかった場所のインデックスを出力します

4

3 に答える 3

3

リスト内の項目がハッシュ可能である場合、それらを dict のキーとして使用できます。

import collections

somelist = list('ABRACADABRA')
dups = collections.defaultdict(list)
for index, item in enumerate(somelist):
    dups[item].append(index)
print(dups)

収量

defaultdict(<type 'list'>, {'A': [0, 3, 5, 7, 10], 'R': [2, 9], 'B': [1, 8], 'C': [4], 'D': [6]})

アイテムがハッシュ可能でない場合 (リストなど)、次善の策は、key各アイテムを一意のハッシュ可能オブジェクト (タプルなど) にマップする関数を (可能であれば) 定義することです。

def key(item):
    return something_hashable
for index, item in enumerate(somelist):
    dups[key(item)].append(index)

そのようなkeyものが見つからない場合は、表示されたアイテムをリストに保存し、表示されたオブジェクトのリスト内の各アイテムとの同等性をテストして重複をテストする必要があります。これは O(n**2) です。

# Don't use this unless somelist contains unhashable items
import collections
somelist = list('ABRACADABRA')
seen = []
dups = collections.defaultdict(list)
for i, item in enumerate(somelist):
    for j, orig in enumerate(seen):
        if item == orig:
            dups[j].append(i)
            break
    else:
        seen.append(item)
print([(seen[key], val) for key, val in dups.iteritems()])

収量

[('A', [3, 5, 7, 10]), ('B', [8]), ('R', [9])]
于 2013-04-03T12:40:12.623 に答える
0

これを試して:

def get_duplicate_indexes(li):
    retval = {}
    for i, x in enumerate(li):
        if x not in retval:
            retval[x] = []
        retval[x].append(i)
    return retval
于 2013-04-04T16:46:06.130 に答える
-1
>>> temp = {}
>>> def print_dupes(a):
...     for i,j in enumerate(a):
...             temp[j] = 0
...     for i,j in enumerate(a):
...             temp[j] += 1
...     for i,j in enumerate(a):
...             if temp[j] > 1:
...                     print i
...
>>> print_dupes([1,1,1,2,2,2,3,3])
0
1
2
3
4
5
6
7
>>> print_dupes([1,1,1,2,2,2,3])
0
1
2
3
4
5
>>> print_dupes([1,1,1,2,3])
0
1
2
于 2013-04-03T12:54:37.033 に答える