从列表列表中的特定点开始循环 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.
希望对您有所帮助! :)
我想在特定点后将现有列表列表的所有元素附加到新列表
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.
希望对您有所帮助! :)