[python] 사전 검색의 파이썬 목록

내가 이것을 가지고 있다고 가정 :

[
{"name": "Tom", "age": 10},
{"name": "Mark", "age": 5},
{"name": "Pam", "age": 7}
]

“Pam”을 이름으로 검색하여 관련 사전을 검색하려고합니다. {name: "Pam", age: 7}

이것을 달성하는 방법?



답변

생성기 표현식을 사용할 수 있습니다 .

>>> dicts = [
...     { "name": "Tom", "age": 10 },
...     { "name": "Mark", "age": 5 },
...     { "name": "Pam", "age": 7 },
...     { "name": "Dick", "age": 12 }
... ]

>>> next(item for item in dicts if item["name"] == "Pam")
{'age': 7, 'name': 'Pam'}

존재하지 않는 항목을 처리 해야하는 경우 Matt가 사용자가 제안한 내용을 수행 하고 약간 다른 API를 사용하여 기본값을 제공 할 수 있습니다 .

next((item for item in dicts if item["name"] == "Pam"), None)

그리고 항목 자체가 아닌 항목의 색인을 찾으 려면 목록을 enumerate () 할 수 있습니다 .

next((i for i, item in enumerate(dicts) if item["name"] == "Pam"), None)


답변

이것은 나에게 가장 파이썬적인 방법으로 보입니다.

people = [
{'name': "Tom", 'age': 10},
{'name': "Mark", 'age': 5},
{'name': "Pam", 'age': 7}
]

filter(lambda person: person['name'] == 'Pam', people)

결과 (Python 2에서 목록으로 반환) :

[{'age': 7, 'name': 'Pam'}]

참고 : Python 3에서는 필터 객체가 반환됩니다. 따라서 python3 솔루션은 다음과 같습니다.

list(filter(lambda person: person['name'] == 'Pam', people))


답변

@ Frédéric Hamidi의 답변은 훌륭합니다. Python 3.x에서는 구문이 .next()약간 변경되었습니다. 따라서 약간의 수정 :

>>> dicts = [
     { "name": "Tom", "age": 10 },
     { "name": "Mark", "age": 5 },
     { "name": "Pam", "age": 7 },
     { "name": "Dick", "age": 12 }
 ]
>>> next(item for item in dicts if item["name"] == "Pam")
{'age': 7, 'name': 'Pam'}

@Matt의 의견에서 언급했듯이 기본값을 다음과 같이 추가 할 수 있습니다.

>>> next((item for item in dicts if item["name"] == "Pam"), False)
{'name': 'Pam', 'age': 7}
>>> next((item for item in dicts if item["name"] == "Sam"), False)
False
>>>


답변

당신은 목록 이해를 사용할 수 있습니다 :

def search(name, people):
    return [element for element in people if element['name'] == name]


답변

people = [
{'name': "Tom", 'age': 10},
{'name': "Mark", 'age': 5},
{'name': "Pam", 'age': 7}
]

def search(name):
    for p in people:
        if p['name'] == name:
            return p

search("Pam")


답변

사전 목록을 살펴보고 키 x에 특정 값이있는 사전을 반환하기 위해 다양한 방법을 테스트했습니다.

결과 :

  • 속도 : 목록 이해> 생성기 표현 >> 일반 목록 반복 >>> 필터.
  • 모든 척도는 목록의 dict 수에 따라 선형입니다 (10x 목록 크기-> 10x 시간).
  • 사전 당 키는 대량 (수천) 키의 속도에 큰 영향을 미치지 않습니다. 내가 계산 한이 그래프를 참조하십시오 https://imgur.com/a/quQzv (방법 이름은 아래 참조).

모든 테스트는 Python 3.6 .4, W7x64로 수행 되었습니다.

from random import randint
from timeit import timeit


list_dicts = []
for _ in range(1000):     # number of dicts in the list
    dict_tmp = {}
    for i in range(10):   # number of keys for each dict
        dict_tmp[f"key{i}"] = randint(0,50)
    list_dicts.append( dict_tmp )



def a():
    # normal iteration over all elements
    for dict_ in list_dicts:
        if dict_["key3"] == 20:
            pass

def b():
    # use 'generator'
    for dict_ in (x for x in list_dicts if x["key3"] == 20):
        pass

def c():
    # use 'list'
    for dict_ in [x for x in list_dicts if x["key3"] == 20]:
        pass

def d():
    # use 'filter'
    for dict_ in filter(lambda x: x['key3'] == 20, list_dicts):
        pass

결과 :

1.7303 # normal list iteration 
1.3849 # generator expression 
1.3158 # list comprehension 
7.7848 # filter


답변

@ FrédéricHamidi에 약간만 추가하십시오.

dicts 목록에 키가 확실하지 않은 경우 다음과 같이 도움이 될 것입니다.

next((item for item in dicts if item.get("name") and item["name"] == "Pam"), None)