问题:在奇数位置提取列表元素
所以我想创建一个列表,它是一些现有列表的子列表。
例如,
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
但是我想知道是否还有另一种方法可以以更少的步骤高效地完成相同的工作。
回答 0
解
是的你可以:
l = L[1::2]
这就是全部。结果将包含放置在以下位置的元素(0
基于-,因此第一个元素在position 0
,第二个元素在1
etc):
1, 3, 5
因此结果(实际数字)将为:
2, 4, 6
说明
将[1::2]
在年底只是为了列表切片的符号。通常采用以下形式:
some_list[start:stop:step]
如果省略start
,将使用默认值(0
)。所以第一个元素(在position 0
,因为索引是0
基于-的)。在这种情况下,将选择第二个元素。
因为省略了第二个元素,所以使用默认值(列表的末尾)。所以列表从第二个元素到最后一个。
我们还提供了第三个参数(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中使用计数器模拟循环的更多信息:在Python“ for”循环中访问索引
回答 1
对于奇数位,您可能需要:
>>>> list_ = list(range(10))
>>>> print list_[1::2]
[1, 3, 5, 7, 9]
>>>>
回答 2
我喜欢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
)。
回答 3
您可以使用按位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
这与问题不完全相关,但对于数据科学家和计算机视觉工程师而言,此方法可能有用。
干杯!
回答 4
list_ = list(range(9))print(list_ [1 :: 2])