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

2025-02-28 08:23:00
admin
原创
74
摘要:问题描述:所以我想创建一个列表,它是某个现有列表的子列表。例如,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: ...

问题描述:

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

例如,

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

但我想知道是否有其他方法可以有效且以更少的步骤完成相同的操作。


解决方案 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基于 的)。在这种情况下,将选择第二个元素。

因为省略了第二个参数 ( stop),所以使用默认值(列表末尾)。因此列表从第二个元素迭代到末尾

我们还提供了第三个参数(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 中使用计数器模拟循环的更多信息:如何在“for”循环中访问索引值?

解决方案 2:

对于奇怪的位置,你可能需要:

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

解决方案 3:

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

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)。

解决方案 4:

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

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

解决方案 5:

您可以使用按位与运算符&

>>> 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]

解释

按位与运算符与 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位运算符页面以了解更多信息。

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

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

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2941  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1803  
  PLM(产品生命周期管理)系统在企业的产品研发、生产与管理过程中扮演着至关重要的角色。然而,在实际运行中,资源冲突是经常会遇到的难题。资源冲突可能导致项目进度延迟、成本增加以及产品质量下降等一系列问题,严重影响企业的效益与竞争力。因此,如何有效应对PLM系统中的资源冲突,成为众多企业关注的焦点。接下来,我们将详细探讨5...
plm项目管理系统   31  
  敏捷项目管理与产品生命周期管理(PLM)的融合,正成为企业在复杂多变的市场环境中提升研发效率、增强竞争力的关键举措。随着技术的飞速发展和市场需求的快速更迭,传统的研发流程面临着诸多挑战,而将敏捷项目管理理念融入PLM,有望在2025年实现研发流程的深度优化,为企业创造更大的价值。理解敏捷项目管理与PLM的核心概念敏捷项...
plm项目   31  
  模块化设计在现代产品开发中扮演着至关重要的角色,它能够提升产品开发效率、降低成本、增强产品的可维护性与可扩展性。而产品生命周期管理(PLM)系统作为整合产品全生命周期信息的关键平台,对模块化设计有着强大的支持能力。随着技术的不断发展,到 2025 年,PLM 系统在支持模块化设计方面将有一系列令人瞩目的技术实践。数字化...
plm软件   28  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用