提取奇数位置的列表元素

所以我想创build一个列表,这是一个现有列表的子列表。

例如,

L = [1, 2, 3, 4, 5, 6, 7] ,我想创build一个子列表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]只是列表切片的符号。 通常是以下列forms:

 some_list[start:stop:step] 

如果我们省略了start ,将使用默认值( 0 )。 所以第一个元素(位置0 ,因为索引是0 )将被选中。 在这种情况下,第二个元素将被选中。

由于第二个元素被省略,所以正在使用默认值(列表的结尾)。 所以列表正在从第二个元素迭代到结束

我们还提供了第三个参数( step ),它是2 。 这意味着一个元素将被选中,下一个将被跳过,等等…

所以,总结一下,在这种情况下[1::2]是指:

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

编辑 :@PreetKukreti给了一个链接的Python列表切片符号的另一种解释。 看到这里: 解释Python的切片符号

额外 – 用enumerate()replace计数器

在你的代码中,你明确地创build和增加计数器。 在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中使用counter来模拟循环:在Python中访问'for'循环的索引

对于奇怪的职位,你可能想要:

 >>>> list_ = list(range(10)) >>>> print list_[1::2] [1, 3, 5, 7, 9] >>>> 

我喜欢列表推导,因为他们的math(设置)语法。 那么这个怎么样:

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

基本上,如果你列举一个列表,你会得到索引x和值y 。 我在这里做的是把y的值input到输出列表(偶数或奇数),并使用索引x来确定这个点是否是奇数( x%2 != 0 )。