Как найти самый большой дубликат списка питонов - PullRequest
0 голосов
/ 07 октября 2018

Учитывая список натуральных чисел, свяжите самый большой дублированный элемент с переменной maximum.Если в списке нет дубликатов, ассоциируйте -1 с maximum.

Ответы [ 4 ]

0 голосов
/ 07 октября 2018

Сортировка списка, перебор списка попарно, выход по первой соответствующей паре.

def maxdup(l):
    l = sorted(l, reverse=True)
    for i in range(1, len(l)):
        if l[i-1] == l[i]:
            return l[i]

    return -1
0 голосов
/ 07 октября 2018

Вы можете сделать это и без счетчиков:

def max_dup(numbers):
    desc_numbers = sorted(numbers, reverse=True)
    for i in range(1, len(desc_numbers)):
        if desc_numbers[i] == desc_numbers[i - 1]:
            return desc_numbers[i]
    return -1

print(max_dup([1,2,3,4,5,5,6,7])) # 5
print(max_dup([1,2,3,4,5,6,7])) # -1
0 голосов
/ 07 октября 2018

Это можно сделать с помощью itertools.groupby , нам сначала нужно будет отсортировать наш список, а затем мы можем взять только k, если соответствующая list(g) имеет len > 1 в новом списке.,Затем мы могли бы использовать max в этом списке

from itertools import groupby
lista = [1, 5, 3, 4, 1, 5, 7]
max_dup = -1

lrg_dup = [k for k, g in groupby(sorted(lista)) if len(list(g)) > 1]
if lrg_dup:
    max_dup = max(lrg_dup)
# 5

Expanded:

lrg_dup = []
listb = sorted(lista)
for k, g in groupby(listb):
    if len(list(g)) > 1:
        lrg_dup.append(k)
0 голосов
/ 07 октября 2018

Существует несколько способов сделать это, в зависимости от ваших требований к сложности времени / пространства.Вот некоторые идеи:

Использование набора

def max_dup(lst):
    seen = set()        
    for i in sorted(lst, reverse=True):
        if i in seen:
            return i
        seen.add(i)
    return -1

Использование collections.Counter

from collections import Counter

def max_dup(lst):
    cnt = Counter(lst)
    return max((k for k in cnt if cnt[k] > 1), default=-1)

Использование itertools.groupby

from itertools import groupby

def max_dup(lst):
    for k, g in groupby(sorted(lst, reverse=True)):
        if len(list(g)) > 1:
            return k
    return -1

В моих тестах (для довольно небольших списков) использование набора представляется самым быстрым способом, ноВаш пробег может варьироваться.

...