提取列表中奇数位置的元素
- 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:
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
),所以使用默认值(列表末尾)。因此列表从第二个元素迭代到末尾。
我们还提供了第三个参数(step
)2
。这意味着将选择一个元素,跳过下一个元素,依此类推……
因此,总结一下,在这种情况下[1::2]
意味着:
取第二个元素(顺便说一下,如果从索引来判断,它是一个奇数元素),
跳过一个元素(因为我们有
step=2
,所以我们跳过一个,与step=1
默认相反),取下一个元素,
重复步骤 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
这与问题并不直接相关,但对于数据科学家和计算机视觉工程师来说,这种方法可能很有用。
扫码咨询,免费领取项目管理大礼包!