Удалить или изменить SPECIFI C повторяющиеся элементы списка (не все повторяющиеся элементы) - PullRequest
1 голос
/ 23 февраля 2020

Я пытаюсь сделать что-то, что может прочитать список символьных элементов и точно сказать, сколько раз повторялся каждый элемент. Моя идея состояла в том, чтобы go просмотреть список, используя для l oop и печатая операторы, которые сообщают мне информацию, которую я хочу.

Это была моя первая идея:

list = ["code", "this", "code"]

for i in range(len(list)):
    list.count(list[i])
    print("{} is repeated ".format(list[i]) + str(list.count(list[i])) + " times")

Когда Я запустил этот код, который он напечатал:

код повторяется 2 раза

это повторяется 1 раз

код повторяется 2 раза

Теперь следующий шаг к моей цели состоял бы в том, чтобы остановить «повторение кода 2 раза» от печати дважды. Это где мои проблемы начинаются. Я искал способы удаления заданных c дубликатов из списков, но все, что я нашел, это способ удалить ВСЕ дубликаты (которые я не хочу, поскольку это сделало бы код бесполезным после того, как он прошел первый элемент список). Поэтому у меня следующие вопросы:

Можно ли удалить определенные c повторяющиеся элементы из списка после печати заявления о повторениях? Это будет означать, что после того, как он напечатает «код повторяется 2 раза», список изменится только на [«this»].

Вместо этого можно будет изменить «значения» указанного повторяемого c элемент? Это будет означать, что после того, как он напечатает «код повторяется 2 раза», список изменится (например) на [0, «this», 0], чтобы я мог использовать оператор if, чтобы ничего не печатать, если элемент = = 0.

Чтобы было ясно, я просто хочу знать:

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

-if это невозможно: другие вещи, которые я мог бы сделать, чтобы достичь своих целей.

1 Ответ

0 голосов
/ 23 февраля 2020

Использование set:

lst = ["code", "this", "code"]
for elem in sorted(set(lst), key = lambda x:lst.index(x)):
    print(f"{elem} is repeated {lst.count(elem)} times")

Или dict.fromkeys:

for elem in dict.fromkeys(lst):
    print(f"{elem} is repeated {lst.count(elem)} times")

Выход:

code is repeated 2 times
this is repeated 1 times

Вы также можете посмотреть на collections.Counter():

from collections import Counter
frequency = Counter(lst)
for word, freq in frequency.items():
    print(f"{word} is repeated {freq} times")

Тот же вывод.

То, что вы говорите, также возможно в некотором смысле, но он не выглядит pythoni c, и я не нахожу это необходимым, однако вот код.

ВНИМАНИЕ : изменение списка во время его перебора - плохая идея.

lst = ['code', 'this', 'code']
i = 0
while any(lst):
    if lst[i] == None:
        i += 1
        continue
    print(f"{lst[i]} is repeated {lst.count(lst[i])} times")
    lst = [None if j == lst[i] else j for j in lst]
    i += 1

Вывод такой же.

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