我碰巧发现自己有一个基本的过滤需求:我有一个列表,我必须通过项目的属性过滤它.
我的代码看起来像这样:
my_list = [x for x in my_list if x.attribute == value]
Run Code Online (Sandbox Code Playgroud)
但后来我想,这样写它会不会更好?
my_list = filter(lambda x: x.attribute == value, my_list)
Run Code Online (Sandbox Code Playgroud)
它更具可读性,如果需要性能,可以取出lambda来获得一些东西.
问题是:使用第二种方式有什么警告吗?任何性能差异?我是否完全错过了Pythonic Way™并且应该以另一种方式(例如使用itemgetter而不是lambda)来完成它?
我想要计算迭代中有多少成员符合给定条件.我想以一种清晰简单的方式来做,最好是相当合理的.
我目前最好的想法是:
sum(meets_condition(x) for x in my_list)
Run Code Online (Sandbox Code Playgroud)
和
len([x for x in my_list if meets_condition(x)])
Run Code Online (Sandbox Code Playgroud)
第一个基于迭代器的大概列表更快.它与您用于测试任何和所有的形式相同.但是它取决于int(True)== 1的事实,这有点难看.
第二个似乎更容易给我看,但它与任何和所有形式都不同.
有没有人有更好的建议?我遗失的地方有图书馆功能吗?
我有以下清单,
mylist = ['0.976850566018849',
'1.01711066941038',
'0.95545901267938',
'1.13665822176679',
'1.21770587184811',
'1.12567451365206',
'1.18041077035567',
'1.13799827821001',
'1.1624485106005',
'1.37823533969271',
'1.39598077584722',
'1.23844320976322',
'1.57397155911713',
'1.40605782943842',
'1.36037525085048',
'1.185',
'1.22795283469963',
'1.17192311574904',
'1.04121940463022',
'1.0133517787145',
'0.986161470813006',
'1.09820439504488',
'1.06640283661947',
'1.05764772395448',
'1.02678616758973',
'1.01876057166248',
'1.09019498604372',
'1.1665479238629',
'1.07170094763279',
'1.1326945725342',
'1.18199297460235',
'1.20353001964446',
'1.00973941850665',
'1.0662943967844',
'1.04876624296406',
'1.12447065457189',
'0.954629674212134',
'1.02961694279098']
Run Code Online (Sandbox Code Playgroud)
我想要做的是计算该列表中> = 1.3的值.返回5,这是:
'1.57397155911713'
'1.40605782943842'
'1.36037525085048'
'1.39598077584722'
'1.37823533969271'
Run Code Online (Sandbox Code Playgroud)
在Python中有一种紧凑的方式吗?
从目标字符串中的列表中查找字符串出现次数的最佳方法是什么?具体来说,我有一个清单:
string_list = [
"foo",
"bar",
"baz"
]
target_string = "foo bar baz bar"
# Trying to write this function!
count = occurrence_counter(target_string) # should return 4
Run Code Online (Sandbox Code Playgroud)
我想优化以最小化速度和内存使用,如果这有所不同.在大小方面,我预计string_list最终可能包含数百个子串.
如何获得此列表中非204的项目数?
data = [204, 204, 204, 500, 204, 204, 500, 500, 204, 404]
number_of_not_204 = any(x != 204 for x in data)
# returns True
print number_of_not_204
# looking to get the number 4 (500, 500, 500, and 404 are not 204)
Run Code Online (Sandbox Code Playgroud)