从列表列表中的特定点开始循环 Python

Loop from a specific point in a list of lists Python

我想在特定点后将现有列表列表的所有元素附加到新列表

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

您可以在迭代中加入一个条件,并且只根据该条件进行添加。一旦你达到了那个特定的指数,就让你的条件成立。像这样:

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]

为什么不展平初始列表并从那里开始

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

会 return [1,2,3,4,5,10,6,2,1] 所以现在你真的在 flat_list[2:]

这里有一些有效迭代数据的函数式方法。

如果子列表大小均匀,并且您知道从哪里开始提取元素的索引,请使用 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)

这假定序列前面没有相同的值。

您可以直接切掉第一个目标列表的剩余部分,然后添加所有后续元素,例如:

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]

大多数答案仅适用于这种特定形状的嵌套列表,但也可以创建适用于任何形状的嵌套列表的解决方案。

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 改变路径参数的副作用,所以它不是一个纯函数。

以下解决方案适用于您的数组仅限于列表列表并且 'sublist' 的大小始终一致的情况,即您的情况下为“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.

希望对您有所帮助! :)