说我有一份清单
>>> s = [ [1,2], [3,4], [5,6] ]
我可以访问第二个列表中的项目:
>>> s[1][0]
3
>>> s[1][1]
4
整个第二个列表为:
>>> s[1][:]
[3, 4]
但为什么以下也给我第二个清单呢?
>>> s[:][1]
[3, 4]
我认为这会给我三个清单中的第二个项目。
可以使用列表理解来实现这一目标(如question 13380993中所述),但我很好奇如何正确理解s[:][1]
。
答案 0 :(得分:4)
s[:]
会返回列表的副本。下一个[...]
适用于先前返回的表达式,[1]
仍然是该列表的第二个元素。
如果您想拥有每一个项目,请使用列表推导:
[n[1] for n in s]
演示:
>>> s = [ [1,2], [3,4], [5,6] ]
>>> [n[1] for n in s]
[2, 4, 6]
答案 1 :(得分:3)
如果我们分解命令,可以很容易地理解行为:
s[:]
将返回整个列表:
[[1, 2], [3, 4], [5, 6]]
选择 [1] 现在给出第二个列表(python索引从零开始)。
答案 2 :(得分:2)
s[:][1]
表示取一份s
的浅表副本并给我第一个元素......虽然s[1][:]
表示给我一个s[1]
的浅表副本。
你可能会混淆你曾经看过利用numpy
允许扩展切片的事情,例如:
>>> a = np.array([ [1,2], [3,4], [5,6] ])
>>> a[:,1]
array([2, 4, 6])
正如你所说,正常列表可以用list-comp完成:
second_elements = [el[1] for el in s]
答案 3 :(得分:2)
s[:]
制作s
的副本,因此以下[1]
访问该副本的第二个元素。这与s[1]
相同。
>>> s = [ [1,2], [3,4], [5,6] ]
>>> s[1]
[3, 4]
>>> s[:][1]
[3, 4]
答案 4 :(得分:2)
s[1][:]
表示s
中第二项的shallow copy,即[3,4]
。
s[:][1]
表示s
的浅表副本中的第二项,也是[3,4]
。
以下是演示:
>>> s = [ [1,2], [3,4], [5,6] ]
>>> # Shallow copy of `s`
>>> s[:]
[[1, 2], [3, 4], [5, 6]]
>>> # Second item in that copy
>>> s[:][1]
[3, 4]
>>> # Second item in `s`
>>> s[1]
[3, 4]
>>> # Shallow copy of that item
>>> s[1][:]
[3, 4]
>>>
此外,[1]
会返回第二个项,而不是第一个,因为Python索引从0
开始。