Метод подсчета списка в условии if питона - PullRequest
0 голосов
/ 28 августа 2018

Следующий код не работает должным образом, я хочу, чтобы он составлял список в новый список без элементов, появляющихся более двух раз. Например, измените l = [3, 3, 3, 5, 9] на [3, 3, 5, 9]. Вот мой код:

l = [3, 3, 3, 5, 9]
bl = []

for i in l:
    if l.count(i) > 2:
        l.remove(i)
    else:
        bl.append(i)
print(l)
print(bl)

Его выход:

[3, 3, 5, 9]
[3, 5, 9]

Список l корректно изменен, а новый список bl не так, как я ожидал. Я думаю, что это неправильно в моем if заявлении.

Ответы [ 3 ]

0 голосов
/ 28 августа 2018

Вы изменяете свой список, перебирая его, создайте копию для его решения:

l = [3,3,3,5,9]
bl = []

for i in l[::]:
    if l.count(i) > 2:
        l.remove(i)
    else:
        bl.append(i)
print(l)
print(bl)

Здесь у вас есть живой пример

0 голосов
/ 28 августа 2018

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

from collections import Counter
l = [3,3,3,5,9]

c = Counter(l)
l_new = [k for k,v in c.items() for _ in range(min(v,2))]

#[3, 3, 5, 9]

Обратите внимание, что, используя count() для каждого элемента в списке, вы получаете решение O(n**2) для чего-то, что может быть сделано за линейное время.
Вот почему я здесь использую счетчик.

0 голосов
/ 28 августа 2018

Я думаю, вам не важно, сколько раз текущий элемент находится в исходном списке, но уже два раза в целевом списке или нет:

l = [3,3,3,5,9]
bl = []

for i in l:
    if bl.count(i) < 2:
        bl.append(i)
print(l)
print(bl)

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