Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Задачка на питоне ноутпад

1617  1 2 3 4 все
NightWatch коренной житель30.07.22 12:30
NightWatch
NEW 30.07.22 12:30 
в ответ VornerX 30.07.22 12:25, Последний раз изменено 30.07.22 12:33 (NightWatch)

Set'ом ты теряешь упорядочивание элементов и исходное количество. Результат в итоговом файле не будет соответствовать задаче.

#21 
VornerX постоялец30.07.22 12:31
VornerX
NEW 30.07.22 12:31 
в ответ Бесконечный цикл 30.07.22 12:02, Последний раз изменено 30.07.22 13:01 (VornerX)
pandas Rolling apply() с окном 5 (и мин элементов тоже 5) где функция возвращает список

Ну да, а еще можно поднять rabbitmq с селери, заскейлить, пусть каждый воркер пишет свою группу, а потом сливать в монгу, а через триггер дергать еще один питон-скрипт, который будет все это завершать ))))
Вариантов с чисто академическим оверхедом можно навалить кучу, вот только зачем?


No problem can be solved by the same kind of thinking that created it.
#22 
VornerX постоялец30.07.22 12:59
VornerX
30.07.22 12:59 
в ответ NightWatch 30.07.22 12:30, Последний раз изменено 30.07.22 13:00 (VornerX)
Set'ом ты теряешь упорядочивание элементов и исходное количество. Результат в итоговом файле не будет соответствовать задаче.

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

names = list(dict.fromkeys(f.read().splitlines()).keys())


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

No problem can be solved by the same kind of thinking that created it.
#23 
Murr патриот30.07.22 13:12
Murr
NEW 30.07.22 13:12 
в ответ VornerX 30.07.22 12:59

Н.П.

Посмотрел предлагаемый код.

Если бы мне было нужно разовое решение для небольшого списка с гарантированной длинной >=5 - удовлетворился бы.

Но вот если бы мне нужно было проверить навыки работы с файлами - все бы получили "неуд"... смущ


#24 
NightWatch коренной житель30.07.22 13:20
NightWatch
NEW 30.07.22 13:20 
в ответ VornerX 30.07.22 12:59, Последний раз изменено 30.07.22 13:27 (NightWatch)
но в переписке core developers можно почитать, что фактическая имплементация такова, что при отсутствии дальнейших манипуляций с сетом, если им оборачивали лист, то ordering гипотетически останется.

Знать внутреннюю имплементацию хорошо, а полагаться на нее плохо - никогда не знаешь, когда она изменится.

https://docs.python.org/3/tutorial/datastructures.html#set...


dict.fromkeys

Этим ты теряешь исходное количество элементов.

.keys()

В данном примере, полагаю, можно опустить. Просто list(dict) даст тот же результат.

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

Я не фантазирую. В задаче не сказано ни про уникальность, ни про дубликаты. Иходить надо из того, что может быть и так и этак.

#25 
VornerX постоялец30.07.22 13:35
VornerX
NEW 30.07.22 13:35 
в ответ Murr 30.07.22 13:12, Последний раз изменено 30.07.22 13:36 (VornerX)
Н.П.
Посмотрел предлагаемый код. Если бы мне было нужно разовое решение для небольшого списка с гарантированной длинной >=5 - удовлетворился бы.
Но вот если бы мне нужно было проверить навыки работы с файлами - все бы получили "неуд"... смущ

Ну с таким подходом к анализу кода и задачи, вы бы у меня по software design тоже бы получили неуд.
Задача была поставлена простая и примитивная и притом на высокоуровневом python (какие "навыки работы с файлами", серьезно? Или вы хотели тут увидеть дескрипторы, буферы, параллельный доступ и пр.? xD). И решение к ней должно быть соответствующее.
А пилить бесконечные (и притом кривые, а-ля подходы из 90-х) академические решения, цель которых просто потрясти уже порядком подряхлевшей пиписькой - забавно ) И не нужно. В практических проектах - это еще хуже, чем неопытный джун.

No problem can be solved by the same kind of thinking that created it.
#26 
Murr патриот30.07.22 14:18
Murr
NEW 30.07.22 14:18 
в ответ VornerX 30.07.22 13:35

И не нужно.

-----

Хи-хи...

Типичная ситуация - мы тебе заказали... и не работает.

Что заказали? 100 девок сгруппировать?

А где не работает? 100 гигабайт девок сгруппировать?

Хи-хи...


И постановка задачи - похожа на учебную - что именно проверяется/закрепляется - вне постановки задачи.

#27 
alex445 коренной житель30.07.22 15:46
NEW 30.07.22 15:46 
в ответ Murr 30.07.22 14:18, Последний раз изменено 30.07.22 15:51 (alex445)

Вот дураки - финансовому спекулянту, криптомагнату бабки бесплатно делаете. А он знай себе сидит, да лучшие варианты нахаляву перебирает.

))


Вообще, очередь с фиксированным размером на 5 элементов, и цикл с итерацией по именам (не сразу все читаем, не по 5 штук за раз, а одно имя за раз), где в каждой итерации содержимое очереди записывается в файл, если очередь полная - лучший вариант.


А где не работает? 100 гигабайт девок сгруппировать?

Такое и в 20 лет сгруппировать не получится, когда питон колом даже во сне. ))

#28 
  max2_2000 местный житель30.07.22 16:39
NEW 30.07.22 16:39 
в ответ 7495 29.07.22 17:09

можно еще так. чем-то лучше, чем-то нет

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);

и вообще: вам код нужен, или файл с именами по группам?

#29 
  max2_2000 местный житель30.07.22 16:40
NEW 30.07.22 16:40 
в ответ uscheswoi_82 30.07.22 00:32
#заменяем новую строку на пробел


єто даст неправильньій результат в случае, если допускается такое:

Маша (наша)

Тупая Клава

Нина К.

...


#30 
  max2_2000 местный житель30.07.22 16:42
NEW 30.07.22 16:42 
в ответ Бесконечный цикл 30.07.22 12:02, Последний раз изменено 30.07.22 16:44 (max2_2000)
(нет времени проверять):

времени только на поп-еть, єто - святое!


- написать кастомный итератор. Либо класс, либо функцию (легче) c yield

лучше сервер с микросервисами. с облаке на виртуальном сервере. и обязательно чтобьі юнитьі (деффки) протестировать, и тдд. и скрам. и дженкинс с докером.

#31 
7495 местный житель30.07.22 19:25
7495
NEW 30.07.22 19:25 
в ответ max2_2000 30.07.22 16:39
и вообще: вам код нужен, или файл с именами по группам?


Мне нужен был результат, с самым простым решением этой задачки (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 в файл тоже сам не справишься? ну и отступьі поделай красиво.

зі. а зачем єто?


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

допустим задачки на яваскрипт потом используются на странице, в общем доступе.


Задачку на питоне решили, это как кирпичик для других несложных экспериментов.


Всем спасибо.



Вопросы и Ответы - Программируем калькулятор пособий для беженцев вместе.
#32 
Бесконечный цикл завсегдатай30.07.22 19:43
NEW 30.07.22 19:43 
в ответ Бесконечный цикл 30.07.22 12:02

Вариант 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")
#33 
Бесконечный цикл завсегдатай30.07.22 19:52
NEW 30.07.22 19:52 
в ответ VornerX 30.07.22 01:30, Последний раз изменено 30.07.22 21:13 (Бесконечный цикл)

так не легче?

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 гипотетически останется. На практике, для простых задач, этого хватает.

Я надеюсь это ты так шутишь. Доверяться слухам и полагаться на то что сеты вроде бы остаются упорядоченными.


Использовать дикты для дедуплицирования это тоже маразм. Хотя работать конечно будет.


В общем, главное такой код не коммитить, а то получится как здесь:



#34 
  max2_2000 местный житель30.07.22 20:13
NEW 30.07.22 20:13 
в ответ 7495 30.07.22 19:25

если нихрена в пайтоне, так, что даже индентьі не можешь подкорректировать, то почему на нем? ладно, вот и индентьі как надо


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);

#35 
  max2_2000 местный житель30.07.22 20:17
NEW 30.07.22 20:17 
в ответ Бесконечный цикл 30.07.22 19:52, Последний раз изменено 30.07.22 20:18 (max2_2000)

maybe AI, deep learning, machine learning or something similar should be used for such a complex problem?

создать робота, обучить его распознавать имена девичьи, читать, писать, группировать, и потом: КЛАЦ! и он все Зделает как надо!

#36 
alex445 коренной житель31.07.22 04:02
NEW 31.07.22 04:02 
в ответ Бесконечный цикл 30.07.22 19:52, Последний раз изменено 31.07.22 20:11 (alex445)
В общем, главное такой код не коммитить, а то получится как здесь:


Разве не бывает "промежуточных" коммитов, которые не надо в прод? Это просто коммит, чтобы зафиксировать промежуточный результат работы, но после которого твоя часть пока что не работает.

#37 
VornerX постоялец31.07.22 14:05
VornerX
NEW 31.07.22 14:05 
в ответ Бесконечный цикл 30.07.22 19:52, Последний раз изменено 31.07.22 14:12 (VornerX)
Ты надеюсь понимаешь какова сложность этого

Надеюсь ты понимаешь, как работает итерация листов и for в питоне вообще? Как идет обращение к индексам листа и что sequence for-a генерит себе при этом и как получает доступ к элементам? Мне лениво читать лекцию, но раз ты пугаешься таких вещей - то явно не знаешь. Хотя внутренняя имплементация не для тебя, т.к. переписка собственно разрабов питона для тебя "слухи" ))


Использовать дикты для дедуплицирования это тоже маразм. Хотя работать конечно будет.

Ну да, а изобретать велосипеды, когда есть подход, который пусть и не предназначался конкретно для решения таких задач, но в итоге широко сейчас используется - конечно же не маразм, велосипеды наше все )) Почаще ходи по исходникам либ, которые импортишь.

No problem can be solved by the same kind of thinking that created it.
#38 
VornerX постоялец31.07.22 14:09
VornerX
NEW 31.07.22 14:09 
в ответ Бесконечный цикл 30.07.22 19:43
Если хочется запись в файл также делать lazy, то надо делать так:

Пфф, а что тут lazy? Тебе вообще смысл этого термина известен? ) Или это потому что ты генератор заюзал? )))

No problem can be solved by the same kind of thinking that created it.
#39 
Бесконечный цикл завсегдатай31.07.22 20:27
NEW 31.07.22 20:27 
в ответ alex445 31.07.22 04:02
Разве не бывает "промежуточных" коммитов, которые не надо в прод? Это просто коммит, чтобы зафиксировать промежуточный результат работы, но после которого твоя часть пока что не работает.

Это шутка, Но в каждой шутке ... В общем смысл в том, что когда ты коммитишь или постишь, то делаешь это публично, и потом будет трудно оправдаться. Это как в другой поговорке:



Это в точь про VornerX


#40 
1 2 3 4 все