Python

Задача python срочно нужно помочь решить

Пять дней летел уже Нильс с дикими гусями. В общем, птичья жизнь была ему по душе: уроков учить не надо, гусей пасти не надо, хворост таскать не надо. Летишь себе и летишь! Синему небу конца-края нет, воздух лёгкий, прохладный, будто в чистой воде в нём купаешься. А земля внизу вся как на ладони. Только и дела – гляди по сторонам. Всё само так и бежит тебе навстречу – и горы, и реки, и города, и деревни. Надоест смотреть вниз, можно смотреть вверх. Это тоже интересно. Облака точно взапуски гонятся за стаей: то догонят её, то отстанут, а то вдруг собьются в кучу и снова разбегутся, как барашки по полю.

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

А делать надо вот что.

Каждая строка слов через пробел разделена на две части, каждая часть заключена в квадратные скобки. Нужно в каждой части взять первое слово после сортировки по алфавиту и получить из этих двух слов набор используемых в них букв без повторений.

Функция принимает произвольное число позиционных аргументов-строк и произвольное число именованных параметров.

Если именованные параметры не переданы, то функция просто возвращает список кортежей, в которых из каждой строки получены значения: (суммарное количество букв в словах двух частей строки, полученная по описанному правилу строка).

Если передан именованный аргумент right_order и он имеет значение True, то кортежи в списке должны быть отсортированы. Если значение False, то сортировка в обратном порядке.

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

Ввод

data = ['[for five days Nils flew][with wild geese]', '[lessons do not need to learn][the geese graze it is not necessary]', '[no need to carry firewood][fly yourself and fly]', '[there is no end to the blue sky][the air is light and cool]']
print(*joys_of_flying(*data), sep="\n")

вывод

(32, 'ieglNs')
(52, 'edgso')
(38, 'ncdrya')
(44, 'eilurba')
Попробуй это:
 from re import match
from functools import partial, reduce
from operator import itemgetter
from itertools import filterfalse

def joys_of_flying(*ss, right_order = None, index = 0):
def process(s):
toset = lambda p: reduce(set.__or__, map(set, p), set())
parts = list(map(match(r"\[([^]]*)\][^]]*\[([^]]*)\]", s).group, range(1, 3)))
total = sum(map(sum, map(partial(map, ' '.__ne__), parts)))
chosen = ''.join(reduce(set.__or__, map(set, map(itemgetter(index), map(sorted, map(str.split, parts)))), set()))
return (total, chosen)
r = list(map(process, ss))
return r if right_order is None else sorted(r, reverse = not right_order)

---------------------
Описание.

Для каждой группы:
Бьём регулярками строку, 1-я группа матча будет первой частью внутри квадратных скобок, 2-я - второй (индексация с единицы). Сохраняем их в переменной parts. Если будут ещё части (три и более), они будут проигнорированы.
Считаем количество символов, кроме пробелов, сохраняем его в total. Здесь можно пойти и таким путём:
 total = sum(map(sum, map(partial(map, str.isalpha), parts))) 
Тогда будут подсчитываться только буквы, как сказано в задании. Разницу увидишь, только если в строке будет что-то ещё, кроме букв, пробелов и сбалансированных квадратных скобок.

Дальше бьём каждую часть по словам, сортируем её по возрастанию, берём из неё слово с индексом index (индексация с нуля), складываем все буквы в множество, объединяем множества обеих частей и склеиваем итоговое множество в строку (chosen). В условии ничего не сказано о порядке уникальных букв внутри этой строки, и у меня порядок отличается от того, что в тестовом примере, но набор букв - тот же.
В кортеже возвращаем кол-во символов и строку.

Описанную логику применяем к каждому аргументу функции и возвращаем кортежи в порядке исходных строк либо в порядке, указанном в right_order.

Нехватка частей в квадратных скобках (например, одна вместо двух) или слов до аргумента index (например, передали 3, а слов всего 3) приведёт к выборсу исключения. Это чтоб без сюрпризов.
ГК
Геннадий Курилов
54 053
Лучший ответ