如果我在Python中创建一个列表并希望编写一个函数,该函数只返回1到x范围内的奇数,我该怎么做?
例如,如果我从1到4(4 ix my x)列表[1,2,3,4],我想返回[1,3]。
答案 0 :(得分:14)
如果您想以任意列表开头:
[item for item in yourlist if item % 2]
但是如果你总是从range
开始,range(1, x, 2)
会更好! - )
例如:
$ python -mtimeit -s'x=99' 'filter(lambda(t): t % 2 == 1, range(1, x))'
10000 loops, best of 3: 38.5 usec per loop
$ python -mtimeit -s'x=99' 'range(1, x, 2)'
1000000 loops, best of 3: 1.38 usec per loop
因此,在这种情况下,正确的方法比某种典型的错误方法快<28次(!)。
如果你需要的话,“比你需要的更通用”解决方案:
$ python -mtimeit -s'yourlist=range(1,99)' '[item for item in yourlist if item % 2]'
10000 loops, best of 3: 21.6 usec per loop
的速度只是错误的两倍,但仍然比“恰到好处”的速度快15倍! - )
答案 1 :(得分:3)
出了什么问题:
def getodds(lst):
return lst[1::2]
... ???
(假设你想要来自某个任意序列的所有其他元素......所有那些都有奇数索引的元素。)
或者,如果您想要一个数字列表中的所有项目,其中该元素的值为奇数:
def oddonly(lst):
return [x for x in lst if x % 2]
[更新:2017]
您可以使用“延迟评估”从生成器中获取这些内容:
def get_elements_at_odd_indices(sequence):
for index, item in enumerate(sequence):
if index % 2:
yield item
else:
continue
为了获得奇数元素(而不是从序列开头的每个奇数偏移处的元素),您可以使用更简单的元素:
def get_odd_elements(sequence):
for item in sequence:
if item % 2:
yield item
else:
continue
这适用于任何序列或可迭代对象类型。 (显然后者仅适用于那些产生数字的序列或迭代...或%2 评估为有意义的“奇数”结果的其他类型。)
另请注意,如果我们想要对Pandas系列或数据帧列或基础NumPy进行有效操作,那么我们可以使用[1 :: 2]切片获取奇数索引处的元素符号,我们可以使用NumPy的“花式索引”来获取包含奇数值的每个元素
例如:
import numpy as nd
arr = nd.arange(1000)
odds = arr[arr%2!=0]
我将“花式索引”显示为 arr [arr%2!= 0] ,因为这样可以更好地过滤掉每个第三,第四或其他第n个元素;但你可以使用更复杂的表达方式。
请注意,语法 arr [arr%2!= 0] 可能看起来有点奇怪。 NumPy超越各种算术和按位运算符以及增强赋值操作的方式很神奇。关键是NumPy将这些操作评估为机器代码,可以在NumPy阵列上有效地进行矢量化......在底层CPU支持的任何地方使用SIMD。例如,在典型的笔记本电脑和台式机系统上,NumPy可以将许多算术运算评估为SSE个操作。
答案 2 :(得分:0)
要获得奇数/偶数范围,并且可能包含数字n,您可以:
def odd_numbers(n):
return range(1, n+1, 2)
def even_numbers(n):
return range(0, n+1, 2)
如果您想要一个通用算法,它将从序列中获取具有奇数索引的项目,您可以执行以下操作:
import itertools
def odd_indexes(sequence):
return itertools.islice(sequence, 1, None, 2)
def even_indexes(sequence):
return itertools.islice(sequence, 0, None, 2)