返回列表中大于某个值的项目列表

95

我有以下清单

j=[4,5,6,7,1,3,7,5]

如何最简单地返回[5,5,6,7,7],其中这些元素j大于或等于5?


3
而什么会是最快的呢? - Oren
你在过滤之前肯定不应该对它们进行排序。因为那会减慢速度。相反,先开始过滤,然后如果需要排序结果再进行排序。 - Pietro Speroni
1
注意:对于询问列表推导式“语法含义”的问题,请参考 https://dev59.com/aGw15IYBdhLWcg3wpNcB。请勿重复关闭。 - Karl Knechtel
7个回答

133
你可以使用列表推导式来过滤它:

你可以使用列表推导式来进行过滤:

j2 = [i for i in j if i >= 5]

如果你希望按照你的示例排序,可以使用sorted

j2 = sorted(i for i in j if i >= 5)

或者在最终列表上调用sort

j2 = [i for i in j if i >= 5]
j2.sort()

当你要将列表传递给 sorted 时,没有必要使用列表推导式。希望你知道生成器表达式,并且只是忘记了它们在这种情况下的适用性 ;) - user395760
1
@Michael,那将是一个很好的补充!:) - ismail
@delnan 没错,我只是复制/粘贴了第一行并将其包装在 sorted() 中。已修复,谢谢。 - Michael Mrozek
@İsmail - numpy有一个where函数(http://docs.scipy.org/doc/numpy/reference/generated/numpy.where.html)。但是在`numpy`中,如果`j`是一个ND数组,你也可以这样做:`j2 = j[j >= 5]`。 - mtrw

18
一个列表推导式是一种简单的方法:
j2 = [x for x in j if x >= 5]

您还可以使用filter来获得完全相同的结果:

j2 = filter(lambda x: x >= 5, j)
请注意,原始列表 j 没有被修改。

13

您可以使用列表推导式:

[x for x in j if x >= 5]

4

使用filter(不使用lambda函数,使用__le__)进行筛选:

j2 = filter((5).__le__, j)

示例(Python 3):

>>> j=[4,5,6,7,1,3,7,5]
>>> j2 = filter((5).__le__, j)
>>> j2
<filter object at 0x000000955D16DC18>
>>> list(j2)
[5, 6, 7, 7, 5]
>>>

示例(Python 2):

>>> j=[4,5,6,7,1,3,7,5]
>>> j2 = filter((5).__le__, j)
>>> j2
[5, 6, 7, 7, 5]
>>>

使用 __le__。我建议使用它。这很简单。__le__ 是您的好朋友。

如果想将其按所需输出排序(两个版本都适用):

>>> j=[4,5,6,7,1,3,7,5]
>>> j2 = filter((5).__le__, j)
>>> sorted(j2)
[5, 5, 6, 7, 7]
>>>

使用sorted

时间:

>>> from timeit import timeit
>>> timeit(lambda: [i for i in j if i >= 5]) # Michael Mrozek
1.4558496298222325
>>> timeit(lambda: filter(lambda x: x >= 5, j)) # Justin Ardini
0.693048732089828
>>> timeit(lambda: filter((5).__le__, j)) # Mine
0.714461565831428
>>>

所以,Justin获胜了!!

number=1 时:

>>> from timeit import timeit
>>> timeit(lambda: [i for i in j if i >= 5],number=1) # Michael Mrozek
1.642193421957927e-05
>>> timeit(lambda: filter(lambda x: x >= 5, j),number=1) # Justin Ardini
3.421236300482633e-06
>>> timeit(lambda: filter((5).__le__, j),number=1) # Mine
1.8474676011237534e-05
>>>

所以Michael胜出了!!

>>> from timeit import timeit
>>> timeit(lambda: [i for i in j if i >= 5],number=10) # Michael Mrozek
4.721306089550126e-05
>>> timeit(lambda: filter(lambda x: x >= 5, j),number=10) # Justin Ardini
1.0947956184281793e-05
>>> timeit(lambda: filter((5).__le__, j),number=10) # Mine
1.5053439710754901e-05
>>>

所以,Justin 又赢了!!

我认为Justin在第二个问题上也赢了。1.610^-5大于3.410^-6。 - Nazmus Sakib AbIR

3

如果您考虑使用NumPy模块,它会让这个任务变得非常简单,正如所请求的那样:

import numpy as np

j = np.array([4, 5, 6, 7, 1, 3, 7, 5])

j2 = np.sort(j[j >= 5])

方括号内的代码j >= 5会生成一个由TrueFalse值组成的列表,这些值将作为索引来选择j中所需的值。最后,我们使用NumPy内置的sort函数进行排序。

测试结果(一个NumPy数组):

array([5, 5, 6, 7, 7])

1

由于您期望的输出是排序的,因此您还需要对其进行排序:

>>> j=[4, 5, 6, 7, 1, 3, 7, 5]
>>> sorted(x for x in j if x >= 5)
[5, 5, 6, 7, 7]

0

还有另外一种方式,

j3 = j2 > 4
print(j2[j3])

它已在Python 3中进行了测试。


它真的能正常运行吗?我得到了 TypeError:'>'不支持列表和整数实例之间的比较 - Mikhail_Sam
这是对之前答案的回应吗?j2是它们中j的处理版本。你能否使代码自包含?但请勿包含"Edit:","Update:"或类似内容 - 答案应该看起来像是今天写的。 - Peter Mortensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接