所以我想创建一个列表,它是一些现有列表的子列表。
例如,
L = [1, 2, 3, 4, 5, 6, 7]
,我想创建一个子列表 li
这样 li
包含 L
中奇数位置的所有元素。
虽然我可以做到
L = [1, 2, 3, 4, 5, 6, 7]
li = []
count = 0
for i in L:
if count % 2 == 1:
li.append(i)
count += 1
但我想知道是否有另一种方法可以有效地以更少的步骤完成相同的操作。
最佳答案
解决方案
是的,您可以:
l = L[1::2]
这就是全部。结果将包含放置在以下位置的元素(基于 0
,因此第一个元素位于位置 0
,第二个位于 1
等。 ):
1, 3, 5
所以结果(实际数字)将是:
2, 4, 6
说明
末尾的 [1::2]
只是列表切片的符号。通常是以下形式:
some_list[start:stop:step]
如果我们省略 start
,将使用默认值 (0
)。因此将选择第一个元素(在位置 0
,因为索引是基于 0
的)。在这种情况下,将选择第二个元素。
因为省略了第二个元素,所以使用默认值(列表末尾)。所以列表被迭代从第二个元素到结尾。
我们还提供了第三个参数 (step
),即 2
。这意味着将选择一个元素,跳过下一个元素,依此类推......
所以,总结一下,在这种情况下 [1::2]
意味着:
- 取第二个元素(顺便说一下,如果你从索引判断,它是一个奇怪的元素),
- 跳过一个元素(因为我们有
step=2
,所以我们跳过一个,与默认的step=1
相反), - 取下一个元素,
- 重复步骤 2.-3。直到到达列表的末尾,
编辑:@PreetKukreti 提供了一个关于 Python 列表切片符号的另一个解释的链接。见这里:Explain Python's slice notation
附加 - 用 enumerate()
替换计数器
在您的代码中,您明确创建并增加计数器。在 Python 中,这不是必需的,因为您可以使用 enumerate()
枚举一些可迭代对象。 :
for count, i in enumerate(L):
if count % 2 == 1:
l.append(i)
上述代码的用途与您使用的代码完全相同:
count = 0
for i in L:
if count % 2 == 1:
l.append(i)
count += 1
更多关于在 Python 中使用计数器模拟 for
循环:Accessing the index in Python 'for' loops
关于python - 提取列表中奇数位置的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12433695/