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


76

我有以下清单

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

返回[5,5,6,7,7]j中大于或等于5的元素的最简单方法是什么?


2
最快的是什么?
奥伦2015年

确保在过滤之前不要对它们进行排序。因为那会减慢很多。而是开始对其进行过滤,如果需要的话,对结果进行排序
Pietro Speroni

Answers:


107

您可以使用列表推导对其进行过滤:

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()

我不知道where语法,很好!
ismail

3
@İsmail'cartman'Dönmez:那可能是因为它是一个SyntaxError :)
Tim Pietzcker 2011年

@Ismail它实际上if,我只是失去了我的脑海里,当我在写这个答案:)。我很高兴您留下该评论,否则我可能不会注意到
Michael Mrozek 2011年

sorted无论如何,您都无需使用列表推导。希望您确实知道生成器表达式,只是忘了它们在这种情况下的

1
@Michael那将是一个不错的补充!:)
ismail

14

列表理解是一种简单的方法:

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

或者,您可以使用filter完全相同的结果:

j2 = filter(lambda x: x >= 5, j)

请注意,原始列表j未修改。


12

您可以使用列表理解:

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

2

使用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
>>> 

贾斯汀赢了!

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
>>> 

迈克尔赢了!

>>> 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
>>> 

贾斯汀再次获胜!


我认为贾斯汀也获得了第二名。1.6 * 10 ^ -5大于3.4 * 10 ^ -6。
Nazmus Sakib AbIR

1

由于所需的输出已排序,因此您还需要对其进行排序:

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

1

如果您正在考虑使用该numpy模块,则可以根据要求使此任务非常简单:

import numpy as np

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

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

括号内的代码j >= 5产生True或的列表False,然后用作的索引以选择中的所需值j。最后,我们使用sort内置的函数进行排序numpy

测试结果(numpy数组):

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

0

还有另一种方式

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

在3.x中测试


真的有效吗?我得到了TypeError: '>' not supported between instances of 'list' and 'int'
Mikhail_Sam,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.