在奇数位置提取列表元素


100

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

例如,

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

但是我想知道是否还有另一种方法可以以更少的步骤高效地完成相同的工作。


@WaleedKhan:为什么他需要列出问题中的理解?
Tamara Wijsman 2012年

1
@TomWijsman:列表理解。ETA:不用理会:我四处寻找,发现了这个答案,表明您在开玩笑。下次放一个笑脸!
大卫·罗宾逊

2
@DavidRobinson:但其他人能否说出来,OP可能不清楚他用两个模棱两可的词表示的意思。只是在各处刺戳一些评论,这样人们才能做好准备并撰写更好的内容;并避免让OP或访客无知... :)
Tamara Wijsman 2012年

Answers:


229

是的你可以:

l = L[1::2]

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

1, 3, 5

因此结果(实际数字)将为:

2, 4, 6

说明

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

some_list[start:stop:step]

如果省略start,将使用默认值(0)。所以第一个元素(在position 0,因为索引是0基于-的)。在这种情况下,将选择第二个元素。

因为省略了第二个元素,所以使用默认值(列表的末尾)。所以列表从第二个元素到最后一个

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

因此,总结起来,在这种情况下[1::2]意味着:

  1. 取第二个元素(顺便说一句,如果从索引判断,它是一个奇数元素),
  2. 跳过一个元素(因为我们有step=2,所以我们跳过了一个元素,这与step=1这与默认设置),
  3. 接下一个元素
  4. 重复步骤2.-3。直到到达列表的末尾,

编辑:@PreetKukreti提供了有关Python的列表切片表示法的另一种解释的链接。看这里:解释Python的切片符号

额外功能-以取代柜台 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

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


@TomWijsman看看这个问题以了解python切片语法
Preet Kukreti 2012年

这个问题要求奇数位。这给出了均匀的位置(0,2,4,6); 听起来好像OP想要索引(1,3,5),它由给出[1,2,3,4,5,6,7][1::2]
Marcin 2012年

@Marcin:是的,我实际上得出了相同的结论(请参阅更正)。这是在我仔细阅读了OP的代码之后得出的。这个问题是基于不同的索引基础而产生的(对我来说,“ 奇数 ”元素是第一个元素,对于OP来说似乎是第二个元素,因此在处进行了索引1)。
塔德克2012年

1
@TomWijsman:对不起,我没有注意到您所做的更改。确实,有一个链接,但是它导致了Numarray项目,而不是Python的list切片。它有所不同,尤其是因为list的slice不保留对原始列表的引用(在Numarray中,您需要显式调用.copy()以使某些内容不引用原始数组)。但是有一些对某些读者来说可能更好的东西真是太好了。您介意将此链接放置在评论中,以便我对其进行投票,它会出现在答案下方吗?
塔德克2012年

@Tadeck“奇数编号的索引”很自然地表示是奇数的索引。
Marcin 2012年

12

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

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

3

我喜欢List理解,因为它们具有Math(Set)语法。那么呢:

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]

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


1
它不是枚举(L)而不是枚举(items)吗?
ab123

0

您可以使用按位AND运算符&。让我们看下面:

x = [1, 2, 3, 4, 5, 6, 7]
y = [i for i in x if i&1]
>>> 
[1, 3, 5, 7]

按位AND运算符与1一起使用,其工作原理是因为,用二进制编写时,奇数必须以其第一位为1。

23 = 1 * (2**4) + 0 * (2**3) + 1 * (2**2) + 1 * (2**1) + 1 * (2**0) = 10111
14 = 1 * (2**3) + 1 * (2**2) + 1 * (2**1) + 0 * (2**0) = 1110

如果值是奇数,则与1的AND运算只会返回1(二进制数1也将有最后一位数字)。

查看Python Bitwise Operator页面了解更多信息。

PS:如果要在数据框中选择奇数和偶数列,则可以在战术上使用此方法。假设面部关键点的x和y坐标以x1,y1,x2等列给出。要使用每个图像的宽度和高度值对x和y坐标进行归一化,您可以简单地执行

for i in range(df.shape[1]):
    if i&1:
        df.iloc[:, i] /= heights
    else:
        df.iloc[:, i] /= widths

这与问题不完全相关,但对于数据科学家和计算机视觉工程师而言,此方法可能有用。

干杯!


-1

list_ = list(range(9))print(list_ [1 :: 2])


请以简短的解释回答,并放置一些正确格式化的代码块。谢谢
venkata krishnan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.