Как зациклить только часть списка с учетом индекса

#python #loops

Вопрос:

Я пытаюсь зациклить список на трех частях, учитывая индексы, например «0,1,2», мне нужно зациклить список от 0 до 1/3, от 1/3 до 2/3 и от 2/3 до 3/3 части списка, но я не знаю, как это сделать

Я пробовал это, но, очевидно, это неправильно:

 def mapping(index, list_all_words, n_threads):
    list_of_ones = []
    for i in range( 0 , (index/n_threads) * len(list_all_words)):
        # do some stuff
 

Комментарии:

1. Будут ли индексы когда-либо чем-то иным, кроме 1,2, … n_threads? Другими словами, вы просто хотите разделить список на n_threads равные части (или настолько равные, насколько это возможно)?

Ответ №1:

Я сделал это:

 index = 0
n_threads = 3
list_all_words = ["test1", "test2", "test3", "test4", "test5", "test6", "test7"]
for i in range( int((index / n_threads) * len(list_all_words)), int(((index   1) /n_threads) * len(list_all_words))):
    print(list_all_words[i])
 

Ответ №2:

 def split(a, n):  # function to split a list in n even parts
    k, m = divmod(len(a), n)
    return list((a[i * k   min(i, m):(i   1) * k   min(i   1, m)] for i in range(n)))

list_all_words = ["test1", "test2", "test3", "test4", "test5", "test6", "test7"]
new_lists = split(list_all_words, 3) # split into 3 parts as equally as possible
for lst in new_lists:
    print(lst)
 

С принтами:

 ['test1', 'test2', 'test3']
['test4', 'test5']
['test6', 'test7']
 

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

     return (a[i * k   min(i, m):(i   1) * k   min(i   1, m)] for i in range(n))