@kyklaed

Не удаляет элементы списка, в чем ошибка?

Всем привет!
есть проблема, есть список, делаю словарь ключом является символ из списка а его значением то сколько раз он содержится в списке.
мне нужно удалить из списка уникальные элементы то есть те которые встречаются один раз.
и нужно учитывать что "X" и 'x' это один и тот же символ.

Так вот проблема в том что из примера ниже не удаляются три числа 1, 8, 2 он их как будто пропускает и я не могу почему и где. Помогите понять в чем ошибка. Есть предположение что проблема возможна с кавычками и он просто пропускает их то есть если обращаться вот так [1] = error, а если так ['1'] = 1, но в тоже время [0] = 2 ноль он читает нормально хотя ключ в словаре тоже в кавычках.
Да код у меня ужасный. но какой есть, как умею.
check = ['X', 'H', 'e', 'V', 'm', 'l', 's', 1, 0, 'y', 'j', 'b', 'g', 'o',
        'R', 'U', 'O', 'p', 'p', 8, 'Y', 'B', 'Y', 'O', 'r', 'E', 't', 'I',
        'w', 'i', 'v', 'o', 2, 'd', 'Z', 'b', 'S', 'T', 'n', 0]
dct={}
for i in check:
    a="{0}".format(i)
    if a.islower() and not a.isdigit():
        if a.upper() in dct:
            dct[a.upper()]+=1
        else:
            dct[a.upper()]=1         
    else:
        if a in dct:
            dct[a]+=1
        else:
            dct[a]=1
        
for i in dct:
    if i in check:        
        if dct[i] == 1:
            check.remove(i)
    else:
        a="{0}".format(i.lower())
        if a in check:
            if dct[a.upper()] == 1 :
                check.remove(a)

                  
#print(dct['1'])
#print(dct['2'])
#print(dct['8'])

print(check)
print(dct)
  • Вопрос задан
  • 231 просмотр
Решения вопроса 1
aRegius
@aRegius
Python Enthusiast
Привет!
>>> check = ['X', 'H', 'e', 'V', 'm', 'l', 's', 1, 0, 'y', 'j', 'b', 'g', 'o',
        'R', 'U', 'O', 'p', 'p', 8, 'Y', 'B', 'Y', 'O', 'r', 'E', 't', 'I',
        'w', 'i', 'v', 'o', 2, 'd', 'Z', 'b', 'S', 'T', 'n', 0]

# приводим к единому регистру
>>> check_low = [i.lower() if isinstance(i, str) else i for i in check]
>>> from collections import Counter

# считаем число вхождений элементов и результат приводим для удобства к списку кортежей
>>> check_pair = Counter(check_low).most_common()

# убираем уникальные
>>> check_pair = [(x, y) for (x, y) in check_pair if y != 1]

# создаем словарь
>>> check_dict = dict(check_pair)
>>> check_dict
{0: 2, 'y': 3, 'b': 3, 'v': 2, 't': 2, 'o': 4, 'p': 2, 'r': 2, 'e': 2, 'i': 2, 's': 2}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@Eugen_p
  • a="{0}".format(i) Зачем?
  • if a.islower() and not a.isdigit(): Зачем?
  • Если хотите показать свой код кому-нибудь используйте pep8
Ответ написан
Комментировать
dimonchik2013
@dimonchik2013
non progredi est regredi
без коллекций: ))))

check=[x.lower() if isinstance(x, str) else x for x in check] 
slovar=dict((i, check.count(i)) for i in check if check.count(i) > 1)
Ответ написан
@Firik67
Middle PHP Developer
Классика.
i = 1
['X', 'H', 'e'] => remove[i] => ['X', 'e'], => i++ => remove[i]???
Удалили элемент и перешли вперед на один шаг, не учитывая что следующий элемент стал как бы текущим.
Итерироваться нужно по копии списка.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы