所以我想创建一个列表,它是某个已有列表的子列表。例如,L = [1, 2, 3, 4, 5, 6, 7],我想创建一个子列表li,使li包含L中所有奇数位置的元素。趁我还能做到
L = [1, 2, 3, 4, 5, 6, 7]
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
但我想知道是否有另一种方法可以有效地、以更少的步骤完成同样的工作。
xam8gpfp1#
对于"奇数“职位,您可能需要:
>>>> list_ = list(range(10)) >>>> print list_[1::2] [1, 3, 5, 7, 9] >>>>
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)。
x
y
x%2 != 0
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
这与问题并不完全相关,但对于数据科学家和计算机视觉工程师来说,这种方法可能是有用的。
vcudknz34#
如果不需要创建list,而只想迭代奇数/偶数元素,也可以使用itertools.islice
list
itertools.islice
import itertools L = [1, 2, 3, 4, 5, 6, 7] li = itertools.islice(l, 1, len(L), 2)
nqwrtyyt5#
溶液是的,您可以:
l = L[1::2]
结果将包含放置在以下位置的元素(基于0,因此第一个元素位于0,第二个元素位于1,等等):
0
1
1, 3, 5
因此结果(实际数字)将为:
2, 4, 6
最后的[1::2]只是列表切片的一种表示法,通常是这样的形式:
[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.,直到到达列表末尾,
start
step
2
step=2
step=1
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
for
5条答案
按热度按时间xam8gpfp1#
对于"奇数“职位,您可能需要:
20jt8wwn2#
我喜欢列表解析是因为它的数学(集合)语法。
基本上,如果你在一个列表上枚举,你会得到索引
x
和值y
,我在这里做的是把值y
放入输出列表(偶数或奇数),并使用索引x
找出那个点是否是奇数(x%2 != 0
)。xfyts7mz3#
您可以使用位AND运算符
&
:这将给你 * 列表中的奇数元素 *。现在要提取奇数索引的元素你只需要稍微修改一下上面的代码:
按位AND运算符与1一起使用,它起作用的原因是,奇数在写入二进制时必须将其第一位数字设为1。
与1的AND运算将只返回1(二进制中的1也将具有最后一位数字1),当值为奇数时。
查看Python Bitwise Operator页面了解更多信息。
附言:如果你想在 Dataframe 中选择奇数和偶数列,你可以策略性地使用这个方法。假设面部关键点的x和y坐标被指定为x1,y1,x2等列...要用每张图像的宽度和高度值归一化x和y坐标,你可以简单地执行:
这与问题并不完全相关,但对于数据科学家和计算机视觉工程师来说,这种方法可能是有用的。
vcudknz34#
如果不需要创建
list
,而只想迭代奇数/偶数元素,也可以使用itertools.islice
nqwrtyyt5#
溶液
是的,您可以:
结果将包含放置在以下位置的元素(基于
0
,因此第一个元素位于0
,第二个元素位于1
,等等):因此结果(实际数字)将为:
解释
最后的
[1::2]
只是列表切片的一种表示法,通常是这样的形式:如果我们省略了
start
,则会使用默认值(0
),因此会选择第一个元素(位于0
,因为索引基于0
),在这种情况下会选择第二个元素。因为省略了第二个元素,所以使用默认值(列表的末尾),所以列表从第二个元素开始迭代到末尾。
我们还提供了第三个参数(
step
),即2
,这意味着将选择一个元素,跳过下一个元素,依此类推...因此,总而言之,在这种情况下
[1::2]
意味着:1.取第二个元素(顺便说一下,如果从索引判断,它是一个奇数元素),
1.跳过一个元素(因为我们有
step=2
,所以我们跳过一个元素,与默认step=1
相反),1.取下一个元素,
1.重复步骤2. -3.,直到到达列表末尾,
额外功能-将计数器替换为
enumerate()
在你的代码中,你显式地创建并增加计数器,在Python中这不是必须的,因为你可以使用
enumerate()
来枚举一些可迭代对象:上面的代码与您使用的代码的用途完全相同:
更多关于在Python中使用计数器模拟
for
循环的内容:Accessing the index in Python 'for' loops