Python удалить, не удаляя из списка двух

#python #list

#python #Список

Вопрос:

Итак, я пробую появление кода 2021, день 3, часть вторая. Редактировать: ссылка показывает только первую часть для тех, кто не выполнил задание. Я добавил вторую часть в конце

Задача состоит в том, чтобы получить правильный код из списка, отфильтровав неправильные.

Прочитайте каждый индекс каждого числа и подсчитайте вхождения символов 1 и 0. Если 1 является наиболее распространенным, сохраните те числа, которые имеют 1 в этом индексе, если это 0, сохраните числа с 0 и перейдите к следующему индексу, повторяйте, пока не останется только одна возможность. Если подсчет является ничьей, сохраните числа с 1 в этом индексе

Аналогичные правила применяются к другому коду, с которым у меня не возникает проблем. Сохраните цифру с меньшим количеством вхождений и 0, если это ничья.

Код и полное описание задачи приведены в конце, пожалуйста, прочитайте то, что я пробовал.

Мой код правильно очищает список до тех пор, пока не останется два элемента. Правила гласят, что когда количество цифр в позиции индекса idx равно нулю, оставьте 1.

Фильтрация работает нормально, насколько я могу отладить.

Вещи, которые я пробовал:

  • Дело не в изменении списка во время цикла, потому что я зацикливаюсь на копии
  • Я пробовал разные методы удаления. list.remove() , list.pop(index) и понимание списка i for i in o2_rating if i != item . Все методы привели к одному и тому же результату

Я провел некоторую отладку и могу подтвердить, что

  • Фильтрация работает нормально (каждая цифра для сохранения, char, выбрана правильно)
  • Условие отрисовки работает нормально, используя те же методы, я могу получить код для наименее подсчитанной цифры каждого индекса
  • Учитывая, что условие рисования работает нормально, я предполагаю, что это происходит, когда в списке остаются два элемента.
  • Невидимого символа нет

Вероятно, я что-то не понимаю, но я не могу понять, что это

Вот код

 def most_common_at_idx(idx, lst):
    idx_lst = []
    for item in lst:
        idx_lst.append(item[idx])
    return most_common_n(idx_lst)[-1] #return -1 index to prevent the "-" from passing

def most_common_n(lst):
    data = Counter(lst)

    two_most_common = data.most_common(2)
    # draw condition, draw in the counting
    if two_most_common[0][1] == two_most_common[1][1]:
        return '-1'

    return two_most_common[0][0]


sample = [
    "00100",
    "11110",
    "10110",
    "10111",
    "10101",
    "01111",
    "00111",
    "11100",
    "10000",
    "11001",
    "00010",
    "01010"
]

power_input = sample


# start with all the values
# gets the most counted number each digit
o2_rating = power_input.copy()
o2_code = ""

for idx in range(0, len(power_input[0])):
    # --- o2 ---
    print(o2_rating)
    if len(o2_rating) == 1:
        o2_code = o2_rating[0]
        break

    char = most_common_at_idx(idx, o2_rating)
    for item in o2_rating.copy():
        if item[idx] != char:
            o2_rating.remove(item)
 

Это печатает

 ['00100', '11110', '10110', '10111', '10101', '01111', '00111', '11100', '10000', '11001', '00010', '01010']
['11110', '10110', '10111', '10101', '11100', '10000', '11001']
['10110', '10111', '10101', '10000']
['10110', '10111', '10101']
['10110', '10111']
 

‘10111’ — это число, которое я должен сохранить

Полный вызов, в pastebin, чтобы он не загромождал сообщение, надеюсь, его не слишком сложно прочитать

Комментарии:

1. Не могли бы вы опубликовать формулировку проблемы? Похоже, что ссылка показывает другую проблему (возможно, часть 3 дня 1, и, возможно, нужно войти, чтобы увидеть часть 2?)

2. @gimix конечно, добавлено в конце, надеюсь, это не слишком сложно прочитать

3. @gimix Я только что добавил небольшое краткое изложение правил

Ответ №1:

Похоже, ваш код работает! Вы просто не отслеживаете обработку. Если вы распечатаете o2_rating в конце, он будет иметь вид:

[‘10111’]

Было бы лучше (ИМХО) настроить ваш код в одной функции. Это делает более очевидным, что все работает, а также более полезным. Вот взломанная версия вашего рабочего кода:

 from collections import Counter

def most_common_at_idx(idx, lst):
    idx_lst = []
    for item in lst:
        idx_lst.append(item[idx])
    return most_common_n(idx_lst)[-1] #return -1 index to prevent the "-" from passing

def most_common_n(lst):
    data = Counter(lst)

    two_most_common = data.most_common(2)
    # draw condition, draw in the counting
    if two_most_common[0][1] == two_most_common[1][1]:
        return '-1'

    return two_most_common[0][0]

def solve_it(o2_rating):
    o2_code = "" 
    for idx in range(len(o2_rating[0])):
        # --- o2 ---
        print(o2_rating)
        if len(o2_rating) == 1:
            # getting here may be sample-dependent -- you may not need this at all
            o2_code = o2_rating[0]
            break

        char = most_common_at_idx(idx, o2_rating)
        for item in o2_rating.copy():
            if item[idx] != char:
                o2_rating.remove(item)
    print(o2_rating)
    o2_code = o2_code if o2_code else o2_rating[0] if o2_rating else None
    return o2_code

sample = [
    "00100",
    "11110",
    "10110",
    "10111",
    "10101",
    "01111",
    "00111",
    "11100",
    "10000",
    "11001",
    "00010",
    "01010"
]

This_prints = """
['00100', '11110', '10110', '10111', '10101', '01111', '00111', '11100', '10000', '11001', '00010', '01010']
['11110', '10110', '10111', '10101', '11100', '10000', '11001']
['10110', '10111', '10101', '10000']
['10110', '10111', '10101']
['10110', '10111']
"""

desired_answer = '10111' # being the number I have to keep
answer = solve_it(sample)
print("ANSWER IS: ", answer)
print("GOT IT!" if answer == desired_answer else "BUMMER!")
 

Комментарии:

1. Если я напечатаю o2_code, это просто пустая строка. Благодаря вашему ответу я заметил, что len(o2_rating) выбирает равенство 1. Но почему он не заменяет o2_code единственным элементом, оставшимся в списке? (o2_rating[0]

2. Я использую Py3.8, и мой код работает правильно. Я бы сказал, что проблема с вашим поиском длины 1 и последующим разрывом заключается в том, что при проверке на пятой / последней итерации длина равна 2, когда вы проверяете длину 1, а затем сразу после этого длина устанавливается равной 1. Но к тому времени вы закончите и выходите из цикла.