Цикл с определенной точки в списке списков Python - PullRequest
0 голосов
/ 12 ноября 2018

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

m = [[1,2,3],[4,5,10],[6,2,1]]
specific point = m[0][2]
newlist = [3,4,5,10,6,2,1]

Ответы [ 6 ]

0 голосов
/ 12 ноября 2018

Приведенное ниже решение будет работать для вашего случая, когда ваш массив ограничен списком списка, а размер «подсписка» одинаков на всем протяжении, то есть «3» в вашем случае

m = [[1,2,3],[4,5,10],[6,2,1]]                                  #input 2D array
a, b = 0, 2                                                     #user input --> specific point a and b
flat_list_m = [item for firstlist in m for item in firstlist]   #flat the 2D list
print (flat_list_m[len(m[0])*a+b:])                             #print from specific position a and b, considering your sublist length is consistent throughout.

Надеюсь, это поможет! :)

0 голосов
/ 12 ноября 2018

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

def flatten_from(sequence, path=[]):
    start = path.pop(0) if path else 0
    for item in sequence[start:]:
        if isinstance(item, (list, tuple)):
            yield from flatten_from(item, path)
        else:
            yield item

С примером из вопроса

>>> list(flatten_from([[1, 2, 3], [4, 5, 10], [6, 2, 1]], [0, 2]))
[3, 4, 5, 10, 6, 2, 1]

Работает также с любой формой и уровнем вложенности входных данных.

m = [[1], [[2], [3, 4, 5, 6, 7]], 8, [9, [10, 11]]]

flatten_from(m, []))       # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
flatten_from(m, [2])       # 8, 9, 10, 11
flatten_from(m, [1, 1, 3]) # 6, 7, 8, 9, 10, 11

Хотя это немного ублюдочный алгоритм. С одной стороны, он использует приятные концепции функционального программирования: рекурсия и выход.

С другой стороны, он основан на побочном эффекте мутации аргумента пути с list.pop, так что это не чистая функция.

0 голосов
/ 12 ноября 2018

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

m = [[1,2,3],[4,5,10],[6,2,1]]
y, x = 0, 2
new_list = m[y][x:] + [v for el in m[y+1:] for v in el]
# [3, 4, 5, 10, 6, 2, 1]
0 голосов
/ 12 ноября 2018

Вот несколько функциональных подходов для эффективной итерации ваших данных.

Если подсписки имеют одинаковый размер, и вы знаете индекс, с которого начинается извлечение элементов, используйте chain + islice:

from itertools import chain, islice
n = 3 # Sublist size.
i,j = 0,2
newlist = list(islice(chain.from_iterable(m), i*n + j, None))

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

V = chain.from_iterable(m)
next(v for v in V if v == m[i][j])
newlist = list(V)
newlist.insert(m[i][j], 0)

Это предполагает, что в последовательности нет идентичного значения ранее.

0 голосов
/ 12 ноября 2018

почему бы не сгладить начальный список и не идти оттуда

flat_list = [item for sublist in m for item in sublist]

вернется [1,2,3,4,5,10,6,2,1], так что теперь вы действительно flat_list[2:]

0 голосов
/ 12 ноября 2018

Вы можете поместить условие в свою итерацию и добавлять только на основе этого условия. Как только вы достигнете этого конкретного индекса, сделайте ваше условие истинным. Примерно так:

m = [[1,2,3],[4,5,10],[6,2,1]]
specific_point = (0,2)
newlist = [3,4,5,10,6,2,1]


output = []
for i in range(len(m)):
    for j in range(len(m[i])):
        if (i,j) < specific_point:
            continue

        output.append(m[i][j])

выход:

[3, 4, 5, 10, 6, 2, 1]
...