Python: get a dict from a list based on something inside the dict

前端 未结 7 643
自闭症患者
自闭症患者 2020-11-30 23:56

I need to be able to find an item in a list (an item in this case being a dict) based on some value inside that dict. The structure o

相关标签:
7条回答
  • 2020-12-01 00:20
    my_item = next((item for item in my_list if item['id'] == my_unique_id), None)
    

    This iterates through the list until it finds the first item matching my_unique_id, then stops. It doesn't store any intermediate lists in memory (by using a generator expression) or require an explicit loop. It sets my_item to None of no object is found. It's approximately the same as

    for item in my_list:
        if item['id'] == my_unique_id:
            my_item = item
            break
    else:
        my_item = None
    

    else clauses on for loops are used when the loop is not ended by a break statement.

    0 讨论(0)
  • 2020-12-01 00:20

    Worked only with iter() for me:

    my_item = next(iter(item for item in my_list if item['id'] == my_unique_id), None)
    
    0 讨论(0)
  • 2020-12-01 00:24

    I used this, since my colleagues are probably more able to understand what's going on when I do this compared to some other solutions provided here:

    [item for item in item_list if item['id'] == my_unique_id][0]
    

    And since it's used in a test, I think the extra memory usage isn't too big of a deal (but please correct me if I am wrong). There's only 8 items in the list in my case.

    0 讨论(0)
  • 2020-12-01 00:29

    Just in case, if you want lookup search on the basis of the key of a dictionary.

    my_item = next((item for item in my_list if item.has_key(my_unique_key)), None)

    For 3.0+, has_key() has been deprecated. Instead use in:

    my_item = next((item for item in mylist if 'my_unique_key' in item), None)

    https://docs.python.org/3.0/whatsnew/3.0.html#builtins

    0 讨论(0)
  • 2020-12-01 00:38

    You can create a simple function for this purpose:

    lVals = [{'title': 'some value', 'value': 123.4,'id': 'an id'},
     {'title': 'another title', 'value': 567.8,'id': 'another id'},
     {'title': 'last title', 'value': 901.2, 'id': 'yet another id'}]
    
    def get_by_id(vals, expId): return next(x for x in vals if x['id'] == expId)
    
    get_by_id(lVals, 'an id')
    >>> {'value': 123.4, 'title': 'some value', 'id': 'an id'}
    
    0 讨论(0)
  • 2020-12-01 00:40
    In [2]: test_list
    Out[2]: 
    [{'id': 'an id', 'title': 'some value', 'value': 123.40000000000001},
     {'id': 'another id', 'title': 'another title', 'value': 567.79999999999995},
     {'id': 'yet another id', 'title': 'last title', 'value': 901.20000000000005}]
    
    In [3]: [d for d in test_list if d["id"] == "an id"]
    Out[3]: [{'id': 'an id', 'title': 'some value', 'value': 123.40000000000001}]
    

    Use list comprehension

    0 讨论(0)
提交回复
热议问题