在列表中查找属性等于某个值(满足任何条件)的对象

新手上路,请多包涵

我有一个对象列表。我想在此列表中找到一个(第一个或其他)对象,该对象具有等于 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() 不会有任何区别,因为它仍然会遍历列表。

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

原文由 seler 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答
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

朴素的循环中断版本是完美的 Pythonic —— 它简洁、清晰且高效。要使其与单行代码的行为相匹配:

 for x in test_list:
    if x.value == value:
        print("i found it!")
        break
else:
    x = None

这会将 None 分配给 x 如果你不 break 退出循环。

原文由 agf 发布,翻译遵循 CC BY-SA 4.0 许可协议

因为它没有被提及只是为了完成。好的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

原文由 Nima Mousavi 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题