Как определить, встречается ли какое-либо значение более двух раз в списке? - PullRequest
0 голосов
/ 05 июля 2018

У меня есть список, и я хотел бы определить, встречается ли какое-либо значение более двух раз. Я пытался использовать коллекции и счетчик, но я не могу заставить их оценить одно значение True или False.

myArray=[1,1,1,1,1,1,1,1,2]

Я бы хотел вернуть: True если любое значение встречается более чем дважды .

Любая помощь приветствуется, и она бы очень помогла, если бы решение было быстрым. Я проверяю сотни тысяч списков. Я новичок в программировании, и это мой первый пост.

РЕДАКТИРОВАТЬ: мои попытки, также я новичок в стеке UI потока

import collections

arr= [1,2,3,5,6]

Counter(arr)

Возвращает: Counter({1: 1, 2: 1, 3: 1, 5: 1, 6: 1})

Ответы [ 4 ]

0 голосов
/ 05 июля 2018

Попробуйте, используя set ()

def OccursMoreThanTwice(myArray):
    for e in myArray:
        if myArray.count(e) > 2:
           return True
    return False

print OccursMoreThanTwice([1,1,1,1,1,1,1,1,2])
0 голосов
/ 05 июля 2018

Вы можете использовать collection.Counter для этого:

from collections import Counter
print any(count > 2 for count in Counter(myArray).itervalues())   # True

Или, если вы используете Python 3:

from collections import Counter
print(any(count > 2 for count in Counter(myArray).values()))   # True
0 голосов
/ 05 июля 2018

Вот один из способов использования collections.defaultdict. Как и метод @ HoriaComan, это решение не требует повторения всего вашего списка.

myArray = [1,1,1,1,1,1,1,1,2]

from collections import defaultdict

def count_limit(L, k=2):
    d = defaultdict(int)
    for item in L:
        if d[item] == k:
            return True
        else:
            d[item] += 1
    return False

res = count_limit(myArray)  # False

Сравнительный анализ производительности

Чтобы продемонстрировать влияние, мы можем сравнить с Counter на более крупной итерации:

myArray = [1,1,1,1,1,1,1,1,2]*10000

from collections import defaultdict, Counter

def count_limit(L, k=2):
    d = defaultdict(int)
    for item in L:
        if d[item] == k:
            return True
        else:
            d[item] += 1
    return False

def count_limit_counter(myArray):
    return any(count > 2 for count in Counter(myArray).values())

%timeit count_limit(myArray)          # 1.52 µs per loop
%timeit count_limit_counter(myArray)  # 6.64 ms per loop
0 голосов
/ 05 июля 2018

Вы всегда можете построить гистограмму значений и посмотреть, больше ли какой-либо записи больше двух. Это может выглядеть примерно так:

def is_more_than_twice(l):
   hist = {}
   for el in l:
       if el in hist:
           hist[el] += 1
       else:
           hist[el] = 1
       if hist[el] > 2:
           return True
   return False

Вам не нужно повторять до конца списка, пока вы не встретите условие, чтобы элемент el появлялся более двух раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...