Упростите код python
упростите следующий код(именно убрать def() , переменную res , так как все в одну строку и ничего не понятно и желательно print() тоже сделать более проще без условных конструкций), буду благодарен, а то def() еще не изучал по программе и не понимаю даже что к чему
def fun(num, word):
letter = [lett for lett in set(word) if word.count(lett) == num]
if len(letter) == 1:
return letter[0]
res = [fun(num, input()) for num in [int(input()) for _ in range(int(input()))]]
print(''.join(res) if all(res) else 'нечленораздельно')
попытка расписать res и print():
n = int(input())
counts = [int(input()) for _ in range(n)]
words = [input() for _ in range(n)]
#for l in words[i]:
#if words[i].count(l) == counts[i]:
if len(res) == n:
print(res)
else:
print('нечленораздельно')
Ответы (1 шт):
а если так попробовать ;-)
n = int(input())
counts = [int(input()) for _ in range(n)]
words = [input() for _ in range(n)]
res = ''.join(map(lambda a: a[0], filter(len, [[l for l in words[i] if words[i].count(l) == counts[i]] for i in range(n)])))
print(res if len(res) == n else 'нечленораздельно')
можно сделать чуть-чуть короче :)))
n = int(input())
res = ''.join(map(lambda a: a[0], filter(len, [[l for l in d[1] if d[1].count(l) == d[0]] for d in zip([int(input()) for _ in range(n)], [input() for _ in range(n)])])))
print(res if len(res) == n else 'нечленораздельно')
без использования lambda (даже покороче получилось):
n = int(input())
counts = [int(input()) for _ in range(n)]
words = [input() for _ in range(n)]
res = ''.join(a[0] for a in filter(len, [[l for l in words[i] if words[i].count(l) == counts[i]] for i in range(n)]))
print(res if len(res) == n else 'нечленораздельно')
и
n = int(input())
res = ''.join(a[0] for a in filter(len, [[l for l in d[1] if d[1].count(l) == d[0]] for d in zip([int(input()) for _ in range(n)], [input() for _ in range(n)])]))
print(res if len(res) == n else 'нечленораздельно')
разъяснение функционала для Марата:
# получить число n
n = int(input())
# получить n чисел
counts = [int(input()) for _ in range(n)]
# получить n строк
words = [input() for _ in range(n)]
# сформировать слово соединением букв из массива без использования разделителя
res = ''.join(
# сформировать массив букв из массива массивов букв выбрав из каждого массива по первой букве
a[0] for a in filter(
# выбрать из сформированного массива массива букв только такие массивы букв, в которых есть буквы (массивы не нулевого размера)
len, [
# сформировать массив букв, которые встречаются в слове заданное число раз
[l for l in words[i] if words[i].count(l) == counts[i]] for i in range(n)
]
)
)
# если в сформированном слове кол-во букв не соответствует кол-ву введённых слов (не равно n)
# то это означает, что какая-то буква для одного из слова найдена не была и в сформированное слово добавлена не была
print(res if len(res) == n else 'нечленораздельно')
Теперь чуть более подробно:
логика следующая:
у нас есть массив кол-в встречающихся букв
countsи массив словwordsрассматривая каждое слово мы формируем 1 букву (или не формируем, но это в итоге приведет к тому, что в сформированном в конце слове букв окажется меньше, чем
nи будет выданонечленораздельно)
поэтому идем по индексам от 0 до n
[...] for i in range(n)
и формируем массив некоторого результата анализа i-ого слова из words и i-ого числа из counts
в каждом слове проходим по всем его буквам
for l in words[i]но только по таким буквам, чье кол-во в слове равно i-ому числу из
countsl in words[i] if words[i].count(l) == counts[i]и формируем массив из найденных букв
[l for l in words[i] if words[i].count(l) == counts[i]]если букв с заданным кол-вом повторений найдено не было, то получится пустой массив
[], чтобы он не мешал в дальнейшей работе с помощью функцииfilterоставляем только массивы символов ненулевой длиныfilter( len, [...] )теперь у каждого элемента массива массивов букв берется первая буква с использованием функции
map(которая применяется к каждому элементу массива) или командыforи формируется массив первых букв из массива массивов[a[0] for a in filter(...)]из массива букв формируется строка соединением букв без разделителя
res = ''.join(...)
в результате получается слово из n символов - удачно собралось слово или из меньшего числа символов при неудачной сборке и это означает 'нечленораздельно'
P.S.
Нашел вариант без использования filter и код стал чуть короче, но чуть сложнее:
res = ''.join(a[0] for a in [[l for l in words[i] if words[i].count(l) == counts[i]] + ['*'] for i in range(n)])
print(res if res.find('*') == -1 else 'нечленораздельно')
необходимость использовать filter было то, что в коде есть обращение к 0 ячейке массива, но когда массив пустой, то происходит ошибка, поэтому такие элементы с помощью filter удалялись
чтобы этого не было теперь всегда к массиву в конце добавляется '*', если буквы в массиве были, то звездочка ни на что не повлияет, а если букв в массиве не было, то по 0 элементу будет считана звездочка
и остаётся проверить только, что в сформированном слове нет звездочки
P.S.
построчный код:
# получить число n
n = int(input())
# получить n чисел
counts = [int(input()) for _ in range(n)]
# получить n строк
words = [input() for _ in range(n)]
# проанализировать все строки
res = []
for index in range(n):
# сформировать массив букв, которые встречаются в слове заданное число раз
letters = [letter for letter in words[index] if words[index].count(letter) == counts[index]]
# если не было найдено букв, встречающихся заданное кол-во раз, то перейти к анализу следующей строки
if len(set(letters)) != 1:
continue
# добавить найденную букву в результат (взять первую из найденных букв)
res.append(letters[0])
# сформировать строку из собранных букв
res = ''.join(res)
# если в сформированном слове кол-во букв не соответствует кол-ву введённых слов (не равно n)
# то это означает, что какая-то буква для одного из слова найдена не была и в сформированное слово добавлена не была
print(res if len(res) == n else 'нечленораздельно')

