Как удалить элементы, повторяющиеся меньше чем k в списке - PullRequest
0 голосов
/ 18 января 2019

В списке python я хочу удалить все элементы, повторяющиеся меньше, чем 'k'. например, если k == 3, то если наш список:

l = [a,b,c,c,c,a,d,e,e,d,d]

тогда вывод должен быть:

[c,c,c,d,d,d]

Какой быстрый способ сделать это (у меня большие данные), есть ли хорошие предложения по питону?

это то, что я кодировал, но я не думаю, что это самый быстрый и самый питонический способ:

from collections import Counter

l = ['a', 'b', 'c', 'c', 'c', 'a', 'd', 'e', 'e', 'd', 'd']

counted = Counter(l)

temp = []
for i in counted:
    if counted[i] < 3:
        temp.append(i)

new_l = []
for i in l:
    if i not in temp:
        new_l.append(i)

print(new_l)

Ответы [ 4 ]

0 голосов
/ 18 января 2019

Есть ли у этой опции недостатки?

l = ['a','b','c','c','c','a','d','e','e','d','d']

res = [ e for e in l if l.count(e) >= 3]

#=> ['c', 'c', 'c', 'd', 'd', 'd']
0 голосов
/ 18 января 2019

Вы можете использовать collections.Counter для построения словаря, отображающего значения в счетчики. Затем используйте понимание списка, чтобы отфильтровать счет, превышающий указанное значение.

from collections import Counter

L = list('abcccadeedd')
c = Counter(L)
res = [x for x in L if c[x] >=3]

# ['c', 'c', 'c', 'd', 'd', 'd']
0 голосов
/ 18 января 2019

Опция грубой силы будет заключаться в том, чтобы получить количество вхождений на элемент, а затем отфильтровать эти выходные данные.collections.Counter объект прекрасно работает здесь:

l = [a,b,c,c,c,a,d,e,e,d,d]
c = Counter(l)

# Counter looks like {'a': 2, 'b': 1, 'c': 3...}

l = [item for item in l if c[item]>=3]

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

c = {}
for item in l:
    # This will check if item is in the dictionary
    # if it is, add to current count, if it is not, start at 0
    # and add 1
    c[item] = c.get(item, 0) + 1

# And the rest of the syntax follows from here
l = [item for item in l if c[item]>=3]
0 голосов
/ 18 января 2019

Я бы использовал Счетчик из коллекций:

from collections import Counter
count_dict = Counter(l)
[el for el in l if count_dict[el]>2]
...