我有一个对象列表。我想在这个列表中找到一个(第一个或任何)对象,它的属性(或方法结果-无论什么)等于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()不会有任何区别,因为它仍然会遍历列表。

附:等式到值只是一个例子。当然,我们想要得到一个满足任何条件的元素。


当前回答

我刚刚遇到了一个类似的问题,并针对列表中没有对象满足要求的情况设计了一个小优化。(对于我的用例,这导致了主要的性能改进):

除了列表test_list,我还保留了一个额外的集test_value_set,它由我需要筛选的列表中的值组成。所以这里agf解的else部分很快。

其他回答

你可以这样做

dict = [{
   "id": 1,
   "name": "Doom Hammer"
 },
 {
    "id": 2,
    "name": "Rings ov Saturn"
 }
]

for x in dict:
  if x["id"] == 2:
    print(x["name"])

这就是我用来在一长串对象中找到对象的方法。

如果你在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。

我刚刚遇到了一个类似的问题,并针对列表中没有对象满足要求的情况设计了一个小优化。(对于我的用例,这导致了主要的性能改进):

除了列表test_list,我还保留了一个额外的集test_value_set,它由我需要筛选的列表中的值组成。所以这里agf解的else部分很快。

因为它没有被提及只是为了完成。 好的ol'过滤器过滤你要过滤的元素。

函数式编程。

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

我知道通常在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