итерация по списку парами или тройками - PullRequest
0 голосов
/ 02 февраля 2020

Я хочу перебрать список файлов в указанной папке c и хранить имена файлов по парам слов или по триплетам. Я создал этот код:

for file_name in os.listdir(path):
    file_name_aslist = file_name.split()
    o = [(file_name_aslist[x], file_name_aslist [x+1]) for x in range(0, len(file_name_aslist ), 2)]

, он возвращает эту ошибку:

IndexError: list index out of range

Выражение работает с одним списком, но не хочет работать внутри l oop: например:

list = ['ra', 'ti', 'kaa', 'esss', 'fm', 'am']
print([(list[x], list[x+1]) for x in range(0, len(list), 2)])

[('ra', 'ti'), ('kaa', 'esss'), ('fm', 'am')]

также, когда я пытаюсь выполнить итерации по триплетам , также отказываются

print([(list[x], list[x+1], list[x+2]) for x in range(0, len(list), 3)])

IndexError: list index out of range

Ответы [ 3 ]

0 голосов
/ 02 февраля 2020

Первое: в вашем примере, использующем «единый список», list не обязательно представляет ваш оригинал file_name_aslist. Если имена ваших файлов не содержат пробелов, file_name_aslist будет списком с одним элементом, самим именем файла. В этих случаях очень легко проверить, почему file_name_aslist [x+1] будет выдавать IndexError.

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

0 голосов
/ 02 февраля 2020

вы разделяете имена файлов на "" (пробел) в этой строке:

file_name_aslist = file_name.split()

вы не можете быть уверены, что все файлы содержат более 1 слова после разделения

что вы можете сделать:

def chunks_n(my_list, n):
    for e in range(0, len(my_list), n):
        yield my_list[e: e + n]

my_list = ['ra']
print(list(chunks_n(my_list, 2)))

вывод:

[['ra']]
0 голосов
/ 02 февраля 2020

просто добавьте условие if, когда длина списка не кратна 2, добавьте в список дополнительную пустую строку, чтобы сделать ее четной. то же самое для тройни. Вы должны добавить одну или две строки.

   #donot use split function.

file_name_aslist = os.listdir(path)
if len(file_name_aslist) // 2 == 0 :
   o = [(file_name_aslist[x], file_name_aslist [x+1]) for x in range(0, 
   len(file_name_aslist ), 2)]
else:
   file_name_aslist.append("")

   o = [(file_name_aslist[x], file_name_aslist [x+1]) for x in range(0, len(file_name_aslist ), 2)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...