Определить повторяющиеся значения в списке в Python
Можно ли получить, какие значения являются дубликатами в списке, используя python?
У меня есть список элементов:
mylist = [20, 30, 25, 20]
Я знаю, что лучший способ удаления дубликатов - set(mylist)
, но можно ли узнать, какие значения дублируются? Как вы можете видеть, в этом списке дубликаты - это первое и последнее значения. [0, 3]
.
Можно ли получить этот результат или что-то подобное в python? Я стараюсь избегать делать смехотворно большой условный оператор if elif
.
Ответы
Ответ 1
Эти ответы - O (n), поэтому немного больше кода, чем использование mylist.count()
, но гораздо более эффективное, поскольку mylist
увеличивается дольше
Если вы просто хотите знать дубликаты, используйте collections.Counter
from collections import Counter
mylist = [20, 30, 25, 20]
[k for k,v in Counter(mylist).items() if v>1]
Если вам нужно знать индексы,
from collections import defaultdict
D = defaultdict(list)
for i,item in enumerate(mylist):
D[item].append(i)
D = {k:v for k,v in D.items() if len(v)>1}
Ответ 2
Вот список, который делает то, что вы хотите. Как сообщает @Codemonkey, список начинается с индекса 0, поэтому индексы дубликатов равны 0 и 3.
>>> [i for i, x in enumerate(mylist) if mylist.count(x) > 1]
[0, 3]
Ответ 3
простейший путь без какого-либо промежуточного списка с помощью list.index():
z = ['a', 'b', 'a', 'c', 'b', 'a', ]
[z[i] for i in range(len(z)) if i == z.index(z[i])]
>>>['a', 'b', 'c']
и вы также можете перечислить дубликаты (может содержать дубликаты снова, как в примере):
[z[i] for i in range(len(z)) if not i == z.index(z[i])]
>>>['a', 'b', 'a']
или их индекс:
[i for i in range(len(z)) if not i == z.index(z[i])]
>>>[2, 4, 5]
или дубликаты в виде списка из 2-х наборов их индекса (только для их первого вхождения), , что является ответом на исходный вопрос!!!:
[(i,z.index(z[i])) for i in range(len(z)) if not i == z.index(z[i])]
>>>[(2, 0), (4, 1), (5, 0)]
или это вместе с самим предметом:
[(i,z.index(z[i]),z[i]) for i in range(len(z)) if not i == z.index(z[i])]
>>>[(2, 0, 'a'), (4, 1, 'b'), (5, 0, 'a')]
или любая другая комбинация элементов и индексов....
Ответ 4
Вы можете использовать сжатие списков и установить для уменьшения сложности.
my_list = [3, 5, 2, 1, 4, 4, 1]
opt = [item for item in set(my_list) if my_list.count(item) > 1]
Ответ 5
Это самый простой способ найти дубликаты в списке:
my_list = [3, 5, 2, 1, 4, 4, 1]
my_list.sort()
for i in range(0,len(my_list)-1):
if my_list[i] == my_list[i+1]:
print str(my_list[i]) + ' is a duplicate'
Ответ 6
Я попытался под кодом найти дубликаты значений из списка
1) создать набор дублированных списков
2) Итерируется через набор, просматривая дубликат списка.
glist=[1, 2, 3, "one", 5, 6, 1, "one"]
x=set(glist)
dup=[]
for c in x:
if(glist.count(c)>1):
dup.append(c)
print(dup)
OUTPUT
[1, 'one']
Теперь получите весь индекс для повторяющегося элемента
glist=[1, 2, 3, "one", 5, 6, 1, "one"]
x=set(glist)
dup=[]
for c in x:
if(glist.count(c)>1):
indices = [i for i, x in enumerate(glist) if x == c]
dup.append((c,indices))
print(dup)
OUTPUT
[(1, [0, 6]), ('one', [3, 7])]
Надеюсь, это поможет кому-то
Ответ 7
Следующий код отобразит желаемые результаты с повторяющимися элементами и их значениями индекса.
for i in set(mylist):
if mylist.count(i) > 1:
print(i, mylist.index(i))
Ответ 8
Следующее понимание списка даст повторяющиеся значения:
[x for x in mylist if mylist.count(x) >= 2]
Ответ 9
Вы должны отсортировать список:
mylist.sort()
После этого проведите по нему так:
doubles = []
for i, elem in enumerate(mylist):
if i != 0:
if elem == old:
doubles.append(elem)
old = None
continue
old = elem
Ответ 10
Вы можете распечатать дубликаты и Unqiue, используя приведенную ниже логику, используя список.
def dup(x):
duplicate = []
unique = []
for i in x:
if i in unique:
duplicate.append(i)
else:
unique.append(i)
print("Duplicate values: ",duplicate)
print("Unique Values: ",unique)
list1 = [1, 2, 1, 3, 2, 5]
dup(list1)
Ответ 11
m = len(mylist)
for index,value in enumerate(mylist):
for i in xrange(1,m):
if(index != i):
if (L[i] == L[index]):
print "Location %d and location %d has same list-entry: %r" % (index,i,value)
У этого есть некоторая избыточность, которая может быть улучшена, однако.