Задачка на питоне ноутпад
Set'ом ты теряешь упорядочивание элементов и исходное количество. Результат в итоговом файле не будет соответствовать задаче.
pandas Rolling apply() с окном 5 (и мин элементов тоже 5) где функция возвращает список
Ну да, а еще можно поднять rabbitmq с селери, заскейлить, пусть каждый воркер пишет свою группу, а потом сливать в монгу, а через триггер дергать еще один питон-скрипт, который будет все это завершать ))))
Вариантов с чисто академическим оверхедом можно навалить кучу, вот только зачем?
Set'ом ты теряешь упорядочивание элементов и исходное количество. Результат в итоговом файле не будет соответствовать задаче.
Сеты заявлены как неупорядоченные, но в переписке core developers можно почитать, что фактическая имплементация такова, что при отсутствии дальнейших манипуляций с сетом, если им оборачивали лист, то ordering гипотетически останется. На практике, для простых задач, этого хватает.
Ну и никто не мешает сделать стандартное
names = list(dict.fromkeys(f.read().splitlines()).keys())
Но конечно, дофантазировывать исходную задачу можно до бесконечности.
Н.П.
Посмотрел предлагаемый код.
Если бы мне было нужно разовое решение для небольшого списка с гарантированной длинной >=5 - удовлетворился бы.
Но вот если бы мне нужно было проверить навыки работы с файлами - все бы получили "неуд"...
но в переписке core developers можно почитать, что фактическая имплементация такова, что при отсутствии дальнейших манипуляций с сетом, если им оборачивали лист, то ordering гипотетически останется.
Знать внутреннюю имплементацию хорошо, а полагаться на нее плохо - никогда не знаешь, когда она изменится.
https://docs.python.org/3/tutorial/datastructures.html#set...
dict.fromkeys
Этим ты теряешь исходное количество элементов.
.keys()
В данном примере, полагаю, можно опустить. Просто list(dict) даст тот же результат.
Но конечно, дофантазировывать исходную задачу можно до бесконечности.
Я не фантазирую. В задаче не сказано ни про уникальность, ни про дубликаты. Иходить надо из того, что может быть и так и этак.
Н.П.
Посмотрел предлагаемый код. Если бы мне было нужно разовое решение для небольшого списка с гарантированной длинной >=5 - удовлетворился бы.
Но вот если бы мне нужно было проверить навыки работы с файлами - все бы получили "неуд"... смущ
Ну с таким подходом к анализу кода и задачи, вы бы у меня по software design тоже бы получили неуд.
Задача была поставлена простая и примитивная и притом на высокоуровневом python (какие "навыки работы с файлами", серьезно? Или вы хотели тут увидеть дескрипторы, буферы, параллельный доступ и пр.? xD). И решение к ней должно быть соответствующее.
А пилить бесконечные (и притом кривые, а-ля подходы из 90-х) академические решения, цель которых просто потрясти уже порядком подряхлевшей пиписькой - забавно ) И не нужно. В практических проектах - это еще хуже, чем неопытный джун.
И не нужно.
-----
Хи-хи...
Типичная ситуация - мы тебе заказали... и не работает.
Что заказали? 100 девок сгруппировать?
А где не работает? 100 гигабайт девок сгруппировать?
Хи-хи...
И постановка задачи - похожа на учебную - что именно проверяется/закрепляется - вне постановки задачи.
Вот дураки - финансовому спекулянту, криптомагнату бабки бесплатно делаете. А он знай себе сидит, да лучшие варианты нахаляву перебирает.
))
Вообще, очередь с фиксированным размером на 5 элементов, и цикл с итерацией по именам (не сразу все читаем, не по 5 штук за раз, а одно имя за раз), где в каждой итерации содержимое очереди записывается в файл, если очередь полная - лучший вариант.
А где не работает? 100 гигабайт девок сгруппировать?
Такое и в 20 лет сгруппировать не получится, когда питон колом даже во сне. ))
можно еще так. чем-то лучше, чем-то нет
devo4ek_v_ku4ke = 5
ku4ka = []
with open('names.txt') as fr:
with open('groups.txt', 'w') as fw:
for line in fr:
ku4ka.append(line.rstrip())
if len(ku4ka) == devo4ek_v_ku4ke:
gang = ' '.join(ku4ka)
fw.write (f'{gang}\n')
ku4ka.pop(0);
и вообще: вам код нужен, или файл с именами по группам?
#заменяем новую строку на пробел
єто даст неправильньій результат в случае, если допускается такое:
Маша (наша)
Тупая Клава
Нина К.
...
(нет времени проверять):
времени только на поп-еть, єто - святое!
- написать кастомный итератор. Либо класс, либо функцию (легче) c yield
лучше сервер с микросервисами. с облаке на виртуальном сервере. и обязательно чтобьі юнитьі (деффки) протестировать, и тдд. и скрам. и дженкинс с докером.
и вообще: вам код нужен, или файл с именами по группам?
Мне нужен был результат, с самым простым решением этой задачки (quick and dirty).
вариант от uscheswoi_82 для меня более доступен для понимания из предложенных:
#8, Вариант от uscheswoi_82, сработал,
#17, Вариант от VornerX, сработал,
#29, Вариант от max2_2000, ошибка:
File "C:\...путь к скрипту.py", line 4
with open('groups.txt', 'w') as fw:
^
IndentationError: expected an indented block
записать list в файл тоже сам не справишься? ну и отступьі поделай красиво.
зі. а зачем єто?
Я деньги люблю, а программировать не умею, такое в нашем мире часто случается,
допустим задачки на яваскрипт потом используются на странице, в общем доступе.
Задачку на питоне решили, это как кирпичик для других несложных экспериментов.
Всем спасибо.

Вариант 1: генераторное выражение вручную (вторая строка)
names = (line.strip() for line in open("input.txt")) groups = (",".join(names[i:i + 5]) for i, n in enumerate(names)) # TODO: убрать последние элементы with open("output.txt", "w") as f: f.write("\n".join(groups))
Вариант 2: генератор комбинация имен автоматом (третья строка)
from more_itertools import windowed names = (line.strip() for line in open("input.txt")) groups = windowed(names, 5) # Генератор всех комбинаций из 5 элементов with open("output.txt", "w") as f: f.write("\n".join(groups))
Если хочется запись в файл также делать lazy, то надо делать так:
with open("output.txt", "w") as f: for п in groups: f.write(",".join(п) + "\n")
так не легче?
with open('/home/me/some_names.txt') as f: names = f.read().splitlines() for i, group in enumerate([ names[names.index(n):names.index(n) + 5] for n in names ]): with open(f'names_group_{i}.txt', 'w') as fw: fw.writelines(' '.join(group))
Ты надеюсь понимаешь какова сложность этого
names[names.index(n):names.index(n) + 5] for n in names
В цикле по элементам списка, получать элемент, и искать его же индекс (что долго, это линейно). Глупее алгоритма не придумаешь.
Сеты заявлены как неупорядоченные, но в переписке core developers можно почитать, что фактическая имплементация такова, что при отсутствии дальнейших манипуляций с сетом, если им оборачивали лист, то ordering гипотетически останется. На практике, для простых задач, этого хватает.
Я надеюсь это ты так шутишь. Доверяться слухам и полагаться на то что сеты вроде бы остаются упорядоченными.
Использовать дикты для дедуплицирования это тоже маразм. Хотя работать конечно будет.
В общем, главное такой код не коммитить, а то получится как здесь:
если нихрена в пайтоне, так, что даже индентьі не можешь подкорректировать, то почему на нем? ладно, вот и индентьі как надо
devo4ek_v_ku4ke = 5 ku4ka = [] with open('names.txt') as fr: with open('groups.txt', 'w') as fw: for line in fr: ku4ka.append(line.rstrip()) if len(ku4ka) == devo4ek_v_ku4ke: gang = ' '.join(ku4ka) fw.write (f'{gang}\n') ku4ka.pop(0);
maybe AI, deep learning, machine learning or something similar should be used for such a complex problem?
создать робота, обучить его распознавать имена девичьи, читать, писать, группировать, и потом: КЛАЦ! и он все Зделает как надо!
В общем, главное такой код не коммитить, а то получится как здесь:
Разве не бывает "промежуточных" коммитов, которые не надо в прод? Это просто коммит, чтобы зафиксировать промежуточный результат работы, но после которого твоя часть пока что не работает.
Ты надеюсь понимаешь какова сложность этого
Надеюсь ты понимаешь, как работает итерация листов и for в питоне вообще? Как идет обращение к индексам листа и что sequence for-a генерит себе при этом и как получает доступ к элементам? Мне лениво читать лекцию, но раз ты пугаешься таких вещей - то явно не знаешь. Хотя внутренняя имплементация не для тебя, т.к. переписка собственно разрабов питона для тебя "слухи" ))
Использовать дикты для дедуплицирования это тоже маразм. Хотя работать конечно будет.
Ну да, а изобретать велосипеды, когда есть подход, который пусть и не предназначался конкретно для решения таких задач, но в итоге широко сейчас используется - конечно же не маразм, велосипеды наше все )) Почаще ходи по исходникам либ, которые импортишь.
Если хочется запись в файл также делать lazy, то надо делать так:
Пфф, а что тут lazy? Тебе вообще смысл этого термина известен? ) Или это потому что ты генератор заюзал? )))
Разве не бывает "промежуточных" коммитов, которые не надо в прод? Это просто коммит, чтобы зафиксировать промежуточный результат работы, но после которого твоя часть пока что не работает.
Это шутка, Но в каждой шутке ... В общем смысл в том, что когда ты коммитишь или постишь, то делаешь это публично, и потом будет трудно оправдаться. Это как в другой поговорке:
Это в точь про VornerX