sel*_*ler 183 python django list
我有对象列表.我想在这个列表中找到一个(第一个或任何)对象,它具有等于的属性(或方法结果 - 无论如何)value.
找到它的最佳方法是什么?
这是测试用例:
class Test:
def __init__(self, value):
self.value = value
import random
value = 5
test_list = [Test(random.randint(0,100)) for x in range(1000)]
# that I would do in Pascal, I don't believe isn't anywhere near 'Pythonic'
for x in test_list:
if x.value == value:
print "i found it!"
break
Run Code Online (Sandbox Code Playgroud)
我认为使用生成器并reduce()没有任何区别,因为它仍然会遍历列表.
ps:方程式value只是一个例子.当然我们想要得到满足任何条件的元素.
agf*_*agf 374
next((x for x in test_list if x.value == value), None)
Run Code Online (Sandbox Code Playgroud)
这将从列表中获取与条件匹配的第一个项目,None如果没有项目匹配则返回.这是我首选的单表达形式.
然而,
for x in test_list:
if x.value == value:
print "i found it!"
break
Run Code Online (Sandbox Code Playgroud)
天真的循环中断版本,完美的Pythonic - 它简洁,清晰,高效.为了使它符合单线的行为:
for x in test_list:
if x.value == value:
print "i found it!"
break
else:
x = None
Run Code Online (Sandbox Code Playgroud)
如果您没有退出循环,这将分配None给x您break.
Moh*_*ari 26
一个简单的例子:我们有以下数组
li = [{"id":1,"name":"ronaldo"},{"id":2,"name":"messi"}]
Run Code Online (Sandbox Code Playgroud)
现在,我们要在数组中找到 id 等于 1 的对象
next具有列表理解的方法next(x for x in li if x["id"] == 1 )
Run Code Online (Sandbox Code Playgroud)
[x for x in li if x["id"] == 1 ][0]
Run Code Online (Sandbox Code Playgroud)
def find(arr , id):
for x in arr:
if x["id"] == id:
return x
find(li , 1)
Run Code Online (Sandbox Code Playgroud)
输出所有上述方法是 {'id': 1, 'name': 'ronaldo'}
Nim*_*avi 16
由于尚未提及完成.好过滤器过滤你的过滤元素.
功能编程ftw.
####### Set Up #######
class X:
def __init__(self, val):
self.val = val
elem = 5
my_unfiltered_list = [X(1), X(2), X(3), X(4), X(5), X(5), X(6)]
####### Set Up #######
### Filter one liner ### filter(lambda x: condition(x), some_list)
my_filter_iter = filter(lambda x: x.val == elem, my_unfiltered_list)
### Returns a flippin' iterator at least in Python 3.5 and that's what I'm on
print(next(my_filter_iter).val)
print(next(my_filter_iter).val)
print(next(my_filter_iter).val)
### [1, 2, 3, 4, 5, 5, 6] Will Return: ###
# 5
# 5
# Traceback (most recent call last):
# File "C:\Users\mousavin\workspace\Scripts\test.py", line 22, in <module>
# print(next(my_filter_iter).value)
# StopIteration
# You can do that None stuff or whatever at this point, if you don't like exceptions.
Run Code Online (Sandbox Code Playgroud)
我知道通常在python列表中,首选理解是首选,或者至少这是我读过的内容,但我不认为问题是诚实的.当然,Python不是FP语言,但Map/Reduce/Filter是完全可读的,是函数式编程中最标准的标准用例.
你去吧 了解你的功能编程.
过滤条件清单
它不会比这更容易:
next(filter(lambda x: x.val == value, my_unfiltered_list)) # Optionally: next(..., None) or some other default value to prevent Exceptions
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
152882 次 |
| 最近记录: |