python 提取列表中奇数位置的元素

qlvxas9a  于 2023-01-04  发布在  Python
关注(0)|答案(5)|浏览(246)

所以我想创建一个列表,它是某个已有列表的子列表。
例如,
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

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

xam8gpfp

xam8gpfp1#

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

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

20jt8wwn2#

我喜欢列表解析是因为它的数学(集合)语法。

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和值y,我在这里做的是把值y放入输出列表(偶数或奇数),并使用索引x找出那个点是否是奇数(x%2 != 0)。

xfyts7mz

xfyts7mz3#

您可以使用位AND运算符&

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

这将给你 * 列表中的奇数元素 *。现在要提取奇数索引的元素你只需要稍微修改一下上面的代码:

>>> x = [10, 20, 30, 40, 50, 60, 70]
>>> y = [j for i, j in enumerate(x) if i&1]
[20, 40, 60]
    • 说明**

按位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也将具有最后一位数字1),当值为奇数时。
查看Python Bitwise Operator页面了解更多信息。
附言:如果你想在 Dataframe 中选择奇数和偶数列,你可以策略性地使用这个方法。假设面部关键点的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

这与问题并不完全相关,但对于数据科学家和计算机视觉工程师来说,这种方法可能是有用的。

vcudknz3

vcudknz34#

如果不需要创建list,而只想迭代奇数/偶数元素,也可以使用itertools.islice

import itertools
L = [1, 2, 3, 4, 5, 6, 7]
li = itertools.islice(l, 1, len(L), 2)
nqwrtyyt

nqwrtyyt5#

溶液
是的,您可以:

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]意味着:
1.取第二个元素(顺便说一下,如果从索引判断,它是一个奇数元素),
1.跳过一个元素(因为我们有step=2,所以我们跳过一个元素,与默认step=1相反),
1.取下一个元素,
1.重复步骤2. -3.,直到到达列表末尾,

额外功能-将计数器替换为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

相关问题