我有一个对象列表。我想在这个列表中找到一个(第一个或任何)对象,它的属性(或方法结果-无论什么)等于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 it's anywhere near 'Pythonic'
for x in test_list:
if x.value == value:
print "i found it!"
break
我认为使用生成器和reduce()不会有任何区别,因为它仍然会遍历列表。
附:等式到值只是一个例子。当然,我们想要得到一个满足任何条件的元素。
举个简单的例子:
我们有下面的数组
li = [{"id":1,"name":"ronaldo"},{"id":2,"name":"messi"}]
现在,我们想在数组中找到id = 1的对象
接下来使用方法与列表理解
next(x for x in li if x["id"] == 1 )
使用列表推导式并返回第一项
[x for x in li if x["id"] == 1 ][0]
自定义函数
def find(arr , id):
for x in arr:
if x["id"] == id:
return x
find(li , 1)
输出上述所有方法是{'id': 1, 'name': 'ronaldo'}
如果你在Python中寻找数组中的对象。你可以使用if条件句。
model_t1 = [0,1,2,3,4]
model_t2 = [7,8,9,15,14]
_data = model_t1
for md in model_t2:
_data.append(md)
for p_data in _data:
if len(p_data['Property']) == 'Value':
print(json(p_data))
next((x for x in test_list if x.value == value), None)
这将从列表中获取与条件匹配的第一项,如果没有项匹配则返回None。这是我喜欢的单表达式形式。
然而,
for x in test_list:
if x.value == value:
print("i found it!")
break
简单的循环中断版本完全是python的——它简洁、清晰、高效。要使它匹配单行程序的行为:
for x in test_list:
if x.value == value:
print("i found it!")
break
else:
x = None
如果不跳出循环,它将把None赋值给x。