Последовательная последовательность строк - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть список строк, которые я собираюсь разбить на подсписки, состоящие из трех элементов: элемента в списке (i), предыдущего элемента (i-1) и следующего элемента (i + 1) , Я также хотел бы перебрать каждый второй элемент в списке, а не каждый элемент. Конкретнее, как мне из этого выйти ...

mylist = ['red','green','blue','yellow','orange','purple','black']

К этому ... (начиная с позиции индекса 1 для включения предыдущего элемента);

mysublists = [['green','red','blue'],['yellow','blue','orange'],['purple','orange','black']]

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

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Если вам нужно решение без понимания списка и zip, вы можете сделать следующее:

def chunk_list(list_to_chunk):
    buffer_list = []
    for index in range(1, len(list_to_chunk) - 1):
        new_list = [list_to_chunk[index], \
                    list_to_chunk[index-1], list_to_chunk[index+1]]

        buffer_list.append(new_list)

    return buffer_list

Код использует цикл for для каждого индекса от 1 до второго последнего индекса (range).

0 голосов
/ 11 сентября 2018

Вы можете использовать понимание списка с zip и нарезку списка:

res = [[j, i, k] for i, j, k in zip(mylist[::2], mylist[1::2], mylist[2::2])]

[['green', 'red', 'blue'],
 ['yellow', 'blue', 'orange'],
 ['purple', 'orange', 'black']]

Или используйте list с zip напрямую для списка кортежей:

res = list(zip(mylist[1::2], mylist[::2], mylist[2::2]))

Если вам нужен список списков с похожим синтаксисом, вы можете использовать map:

res = list(map(list, zip(mylist[1::2], mylist[::2], mylist[2::2])))
...