Find object in list that has attribute equal to some value (that meets any condition)
Hire the world's top talent on demand or became one of them at Toptal: https://topt.al/25cXVn
and get $2,000 discount on your first invoice
--------------------------------------------------
Music by Eric Matyas
https://www.soundimage.org
Track title: Darkness Approaches Looping
--
Chapters
00:00 Find Object In List That Has Attribute Equal To Some Value (That Meets Any Condition)
00:46 Accepted Answer Score 785
01:19 Answer 2 Score 39
02:20 Answer 3 Score 4
02:52 Answer 4 Score 44
03:21 Thank you
--
Full question
https://stackoverflow.com/questions/7125...
--
Content licensed under CC BY-SA
https://meta.stackexchange.com/help/lice...
--
Tags
#python #django #list
#avk47
ACCEPTED ANSWER
Score 785
next((x for x in test_list if x.value == value), None)
This gets the first item from the list that matches the condition, and returns None if no item matches. It's my preferred single-expression form.
However,
for x in test_list:
    if x.value == value:
        print("i found it!")
        break
The naive loop-break version, is perfectly Pythonic -- it's concise, clear, and efficient. To make it match the behavior of the one-liner:
for x in test_list:
    if x.value == value:
        print("i found it!")
        break
else:
    x = None
This will assign None to x if you don't break out of the loop.
ANSWER 2
Score 44
A simple example: We have the following array
li = [{"id":1,"name":"ronaldo"},{"id":2,"name":"messi"}]
Now, we want to find the object in the array that has id equal to 1
- Use method 
nextwith list comprehension 
next(x for x in li if x["id"] == 1 )
- Use list comprehension and return first item
 
[x for x in li if x["id"] == 1 ][0]
- Custom Function
 
def find(arr , id):
    for x in arr:
        if x["id"] == id:
            return x
find(li , 1)
Output all the above methods is {'id': 1, 'name': 'ronaldo'}
ANSWER 3
Score 39
Since it has not been mentioned just for completion. The good ol' filter to filter your to be filtered elements.
Functional programming 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.
I know that generally in python list comprehensions are preferred or at least that is what I read, but I don't see the issue to be honest. Of course Python is not an FP language, but Map / Reduce / Filter are perfectly readable and are the most standard of standard use cases in functional programming.
So there you go. Know thy functional programming.
filter condition list
It won't get any easier than this:
next(filter(lambda x: x.val == value,  my_unfiltered_list)) # Optionally: next(..., None) or some other default value to prevent Exceptions
ANSWER 4
Score 4
You could also implement rich comparison via __eq__ method for your Test class and use in operator.
Not sure if this is the best stand-alone way, but in case if you need to compare Test instances based on value somewhere else, this could be useful.
class Test:
    def __init__(self, value):
        self.value = value
    def __eq__(self, other):
        """To implement 'in' operator"""
        # Comparing with int (assuming "value" is int)
        if isinstance(other, int):
            return self.value == other
        # Comparing with another Test object
        elif isinstance(other, Test):
            return self.value == other.value
import random
value = 5
test_list = [Test(random.randint(0,100)) for x in range(1000)]
if value in test_list:
    print "i found it"