#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. Но к тому времени вы закончите и выходите из цикла.