Python 2D列表切片

6

我四处查找,却没有发现类似的内容,所以来问这里:

我有一个列表的列表:

S = [[3,4],[6,7],[10,12]]

我想将第i个索引元素的第0个索引添加到另一个列表的末尾:

R = [5,6,7]

通常情况下,对于一个一维列表,我可以这样说:

R = R + S[i:]

我想取出从第i个索引开始的所有元素,但我希望取出2D S中第i个索引的0号元素。如果我们从i=1开始,最终得到:

R = [5,6,7,6,10]

另外,我不想使用for循环,我希望有一种列表切片方法可以解决问题(如果有的话),因为它需要在特定范围内。


2
“因为它需要在某个特定的范围内”。这是什么意思?不清楚哪些限制条件可以被for循环违反,但不能被切片违反。 - user2357112
3
如果您需要频繁使用嵌套列表来代替多维数组,请考虑使用 numpy - jonrsharpe
@user2357112:我有一个使用1D方法的示例代码,只需将S[i:]的切片部分添加到R的末尾,因此我认为使用类似的方法将保持所需的边界。另外,随着我学习一些更清晰的Python风格代码,我想知道是否有一种这样做的方法。 - Roklobster
@jonrsharpe:这是一个作业的一部分,只能使用内置库,所以numpy不行,否则我肯定会用它。 - Roklobster
1
@Roklobster 如果这是一项作业,难道你不应该自己完成吗? - jonrsharpe
这实际上只是任务的一小部分,当我遇到使用切片或for循环时,我想知道是否可以这样做。如果我懒得话,我可以轻松地保持我的回答如下:s = [S[i][0] for i in range(len(S))] R = R + s但我想知道是否有更简洁的方法可以使用切片。 - Roklobster
2个回答

5
你可以使用 zip 来转置矩阵:
>>> S
[[3, 4], [6, 7], [10, 12]]
>>> zip(*S)
[(3, 6, 10), (4, 7, 12)]

然后切换位置:
>>> j=0
>>> i=1
>>> zip(*S)[j][i:]
(6, 10)

元组是可迭代的,因此可以与列表进行拼接:

>>> R = [5,6,7]
>>> R+=zip(*S)[j][i:]
>>> R
[5, 6, 7, 6, 10]

1

正如 @jonrsharpe 提到的那样,numpy 可以为您解决问题:

import numpy as np
# Create two arrays
S = np.asarray([[3,4],[6,7],[10,12]])
R = np.asarray([5, 6, 7])
# Slice the S array
i = 1
sliced_S = S[i:, 0]
# Concatenate the arrays
R = np.concatenate((R, sliced_S))

请仔细查看numpy文档,特别是索引部分。


正如我告诉@jonrsharpe的那样,我只能使用内置库,因为它正在一个计算机科学系集群上进行测试,我不能确定numpy是否可用。 - Roklobster
在作业的情况下,我们不倾向于提供解决方案,而是提供提示:看一下zip函数和https://dev59.com/cmQn5IYBdhLWcg3wLkkd#17037588。 - Till Hoffmann
我并不是在寻找作业解决方案,而是想了解最佳实践,但这确实是一种可靠的方法。 - Roklobster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接