在奇数位置提取列表元素

vee*_*psk 87 python list slice

所以我想创建一个列表,它是一些现有列表的子列表.

例如,

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
Run Code Online (Sandbox Code Playgroud)

但我想知道是否有其他方法可以有效地以较少的步骤进行相同的操作.

Tad*_*eck 205

是的你可以:

l = L[1::2]
Run Code Online (Sandbox Code Playgroud)

这就是全部.结果将包含放置在以下位置的元素(0基于,因此第一个元素位于位置0,第二个元素位于1等位置):

1, 3, 5
Run Code Online (Sandbox Code Playgroud)

所以结果(实际数字)将是:

2, 4, 6
Run Code Online (Sandbox Code Playgroud)

说明

[1::2]在年底只是为了列表切片的符号.通常它是以下形式:

some_list[start:stop:step]
Run Code Online (Sandbox Code Playgroud)

如果省略start,则使用default(0).因此,将选择第一个元素(在位置0,因为索引是0基于的).在这种情况下,将选择第二个元素.

因为省略了第二个元素,所以使用了默认值(列表的末尾).所以列表正在从第二个元素迭代到结尾.

我们还提供了第三个参数(step)2.这意味着将选择一个元素,将跳过下一个元素,依此类推......

所以,总结一下,在这种情况下[1::2]意味着:

  1. 取第二个元素(顺便说一下,如果你从索引中判断,它是一个奇数元素),
  2. 跳过一个元素(因为我们有step=2,所以我们跳过一个,相反step=1默认),
  3. 采取下一个元素,
  4. 重复步骤2.-3.直到列表结束,

编辑:@PreetKukreti给出了关于Python列表切片符号的另一个解释的链接.请参阅此处:解释Python的切片表示法

额外 - 用替换计数器 enumerate()

在您的代码中,您明确地创建并增加计数器.在Python中,这不是必需的,因为您可以通过一些iterable枚举使用enumerate():

for count, i in enumerate(L):
    if count % 2 == 1:
        l.append(i)
Run Code Online (Sandbox Code Playgroud)

以上与您使用的代码完全相同:

count = 0
for i in L:
    if count % 2 == 1:
        l.append(i)
    count += 1
Run Code Online (Sandbox Code Playgroud)

有关for在Python中使用计数器模拟循环的更多信息:在Python中访问'for'循环中的索引

  • 几秒钟就把它打败了.Upvote恭喜你! (2认同)
  • @PreetKukreti:我们知道这一点,只是说...... OP怎么知道?谢谢塔德克!:) (2认同)

dst*_*erg 10

对于奇数位置,您可能需要:

>>>> list_ = list(range(10))
>>>> print list_[1::2]
[1, 3, 5, 7, 9]
>>>>
Run Code Online (Sandbox Code Playgroud)


小智 6

我喜欢列表推导式,因为它们的数学(集合)语法。那么这个怎么样:

L = [1, 2, 3, 4, 5, 6, 7]
odd_numbers = [y for x,y in enumerate(L) if x%2 != 0]
even_numbers = [y for x,y in enumerate(L) if x%2 == 0]
Run Code Online (Sandbox Code Playgroud)

基本上,如果您枚举列表,您将获得 indexx和 value y。我在这里所做的是将值y放入输出列表(偶数或奇数)并使用索引x来确定该点是否为奇数 ( x%2 != 0)。