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

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

1617  1 2 3 4 все
7495 местный житель29.07.22 17:09
7495
29.07.22 17:09 

Имеем файл имена.тхт в нем один столбец, с допустим 100 именами девушек:


Евлампия

Гликерия

Степанида

Ива

Муза

Хлоя

Ляля

....


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


Евлампия Гликерия Степанида Ива Муза

Гликерия Степанида Ива Муза Хлоя

Степанида Ива Муза Хлоя Ляля


и так далее...

Вопросы и Ответы - Программируем калькулятор пособий для беженцев вместе.
#1 
alex445 коренной житель29.07.22 17:21
NEW 29.07.22 17:21 
в ответ 7495 29.07.22 17:09, Последний раз изменено 29.07.22 17:27 (alex445)

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

Вы реально вообще программирование не знаете? Тут простой цикл и чтение/запись в файл.

#2 
7495 местный житель29.07.22 17:36
7495
NEW 29.07.22 17:36 
в ответ alex445 29.07.22 17:21
Вы уже спрашивали что-то подобное...

Не мешайся в моих темах. Это программирование, тебе это наверное уже никогда не понять, я же уже 100 раз объяснял как работает блокчейн.

Там было на яваскрипт, тема боковое смещение каретки, из большого числа рубил маленькие по 42 знака, адреса куда складывать деньги,

А тут девушки, рабочая неделя, сечёшь? Значит я уже нарубил бабла, к тому же тут питон, хотя можно и на скрипте, потом скопирую мышкой.

Вопросы и Ответы - Программируем калькулятор пособий для беженцев вместе.
#3 
Murr патриот29.07.22 20:01
Murr
NEW 29.07.22 20:01 
в ответ 7495 29.07.22 17:09

преобразовать в группы со сдвигом в одно имя

-----

Тебе алгоритм или код?

Если алгоритм - то через кольцевой буфер на 5 элементов.

Если код - так это не ко мне...

#4 
alex445 коренной житель29.07.22 22:11
NEW 29.07.22 22:11 
в ответ Murr 29.07.22 20:01

Не буфер, а очередь. Только в Дотнете нет очереди с фиксированной длиной из коробки.

#5 
  max2_2000 местный житель29.07.22 23:33
NEW 29.07.22 23:33 
в ответ 7495 29.07.22 17:09, Последний раз изменено 29.07.22 23:54 (max2_2000)

примитифф. что-то такое:

names = []

with open (filename) as f:

for line in f:

array.append(line)

#имеем list с именами. делаем группьі

groups = []

i = 0

while i < len(names) - 5 #проверь, нужно ли меньше/меньшеравно и 5 или что-то другое, неохота думать

groupline = ' '.join (names[i:i+5]

groups.append(groupline)

i+=1

записать list в файл тоже сам не справишься? ну и отступьі поделай красиво.

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

#6 
uscheswoi_82 коренной житель30.07.22 00:32
NEW 30.07.22 00:32 
в ответ 7495 29.07.22 17:09

Так наверное:

items = [] #items массив
r = open("имена.txt", "r") #Открываем файл имена.txt для чтения
w = open("группа.txt", "w") #Открыввем файл группа.тхт для записи

#цикл, читаем из файла имена.txt
for i in r:
  items.append(i.replace("\n", " ")) #заменяем новую строку на пробел и добавляем в массив items

#Пока массив не пустой...
while len(items) > 0:
  #Считываем из массива, и записываем в файл
  for i in items:
    w.write(i)

  w.write("\n") #Новая строка
  items.pop(0) #Удаляем первый элемент в массиве
Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
#7 
uscheswoi_82 коренной житель30.07.22 01:27
NEW 30.07.22 01:27 
в ответ uscheswoi_82 30.07.22 00:32, Последний раз изменено 30.07.22 11:22 (uscheswoi_82)

Второй вариант:

items = [] #items массив
r = open("имена.txt", "r") #Открываем файл имена.txt для чтения
w = open("группа.txt", "w") #Открыввем файл группа.тхт для записи
#цикл, читаем из файла имена.txt
for i in r:
  items.append(i.replace("\n", " ")) #заменяем новую строку на пробел и добавляем в массив items
#Пока массив не пустой...
while len(items) > 0:
  #Считываем из массива, и записываем в файл
  for i in range(0, 5):
    w.write(items[ i ])
  w.write("\n") #Новая строка
  items.pop(0) #Удаляем первый элемент в массиве
Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
#8 
VornerX постоялец30.07.22 01:30
VornerX
NEW 30.07.22 01:30 
в ответ uscheswoi_82 30.07.22 00:32, Последний раз изменено 30.07.22 01:49 (VornerX)

Ужс какой... я вам как художник художнику скажу... (с)
А так не легче?

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))
No problem can be solved by the same kind of thinking that created it.
#9 
uscheswoi_82 коренной житель30.07.22 04:37
NEW 30.07.22 04:37 
в ответ uscheswoi_82 30.07.22 01:27

Чтобы ошибка не показывалась надо написать так:

while len(items) >= 5:
Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
#10 
NightWatch коренной житель30.07.22 10:05
NightWatch
NEW 30.07.22 10:05 
в ответ VornerX 30.07.22 01:30, Последний раз изменено 30.07.22 10:06 (NightWatch)
with open(f'names_group_{i}.txt'

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

names[names.index(n):names.index(n) + 5] for n in names

А что будет, если имена девушек не уникальны в исходном файле?

#11 
Бесконечный цикл завсегдатай30.07.22 10:41
NEW 30.07.22 10:41 
в ответ max2_2000 29.07.22 23:33, Последний раз изменено 30.07.22 10:42 (Бесконечный цикл)

Старый, твой код это хороший пример как не надо писать на Питоне. Так даже не джуны пишут, а какие-то переученые существа. Завел кучу явных циклов хотя надо чем меньше циклов тем лучше. Далее ручная итерация через i - это на каком языке? Ну и явно пихать все пятерки в список это финиш.

#12 
Бесконечный цикл завсегдатай30.07.22 10:46
NEW 30.07.22 10:46 
в ответ NightWatch 30.07.22 10:05
А что будет, если имена девушек не уникальны в исходном файле?

Это уже проблема самих девушек. Так же как и их имена типа Хлоя - я бы бактерию так назвал.


#13 
NightWatch коренной житель30.07.22 10:52
NightWatch
NEW 30.07.22 10:52 
в ответ Бесконечный цикл 30.07.22 10:46

Это мнение психолога-микробиолога или программиста?

#14 
uscheswoi_82 коренной житель30.07.22 11:25
NEW 30.07.22 11:25 
в ответ Бесконечный цикл 30.07.22 10:46
Хлоя - я бы бактерию так назвал.

Единственную Хлою знаю это девушка андроид из игры Detroit Become Human, она в главном меню говорит:


Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
#15 
  max2_2000 местный житель30.07.22 11:31
NEW 30.07.22 11:31 
в ответ Бесконечный цикл 30.07.22 10:41, Последний раз изменено 30.07.22 11:34 (max2_2000)

да мне насрать. конечно, если бьі нужно "красиво", то я бьі вообще никаких огромньіх массивов не создавал, а читал бьі по пять штук в группу и записьівал в файл. но для на один раз, бьістро и каждому говнюку с дивана чтобі сразу понятно, а кому-то еще и редкий случай себя гением почудить. так что мой код - лучше всего того, что за ним последовало. и где все бьіли? и где твой код как надо писать? надо писать чтобьі надежно результат правильньій получить. а вариантов - тьісячи. даже для полиньі с евдокией

зі. все дружно ждем твой правильньій pythonian код.

#16 
VornerX постоялец30.07.22 11:39
VornerX
NEW 30.07.22 11:39 
в ответ NightWatch 30.07.22 10:05, Последний раз изменено 30.07.22 11:48 (VornerX)

Да, с одним файлом проглядел, ну тогда ж еще проще.

with open('/home/me/some_names.txt') as f:
    names = f.read().splitlines()

groups = [names[names.index(n):names.index(n) + 5] for n in names]
with open('groups_result.txt', 'w') as fw:
    for group in groups:
        fw.write(f"{' '.join(group)}\n")


Про "уникализацию" записываемых в итоговый файл значений, я в задаче не вижу.

Более того, если там ожидается четкое структурное смещение на одну позицию и вот такая разбивка по группам, то подозреваю, что удаление дубликатов - сильно похерит это ожидание )) Ой, но даже если бы, ну еще одна доп. проверка, перед вставкой в лист. Идею-то вы поняли.

No problem can be solved by the same kind of thinking that created it.
#17 
Бесконечный цикл завсегдатай30.07.22 12:02
NEW 30.07.22 12:02 
в ответ 7495 29.07.22 17:09, Последний раз изменено 30.07.22 19:41 (Бесконечный цикл)
Вариант 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")


#18 
NightWatch коренной житель30.07.22 12:21
NightWatch
NEW 30.07.22 12:21 
в ответ VornerX 30.07.22 11:39
Про "уникализацию" записываемых в итоговый файл значений, я в задаче не вижу

Ты проглядел еще раз. Я не говорил про итоговый файл. Я говорил про исходный файл.

#19 
VornerX постоялец30.07.22 12:25
VornerX
NEW 30.07.22 12:25 
в ответ NightWatch 30.07.22 12:21, Последний раз изменено 30.07.22 12:31 (VornerX)
Ты проглядел еще раз. Я не говорил про итоговый файл. Я говорил про исходный файл.

Я не проглядел, а смотрел в исходную задачу, а не в твой коммент.

Ну ок, чтение исходных значений просто оборачивается в сет.

names = set(f.read().splitlines())
No problem can be solved by the same kind of thinking that created it.
#20 
1 2 3 4 все