dicts 목록에서 값 목록 가져 오기


184

나는 이와 같은 dicts 목록을 가지고있다 :

[{'value': 'apple', 'blah': 2}, 
 {'value': 'banana', 'blah': 3} , 
 {'value': 'cars', 'blah': 4}]

내가 원하는 ['apple', 'banana', 'cars']

가장 좋은 방법은 무엇입니까?

답변:


324

모든 dict에 value키 가 있다고 가정하면 쓸 수 있습니다 (목록의 이름이이라고 가정 l)

[d['value'] for d in l]

value누락 된 경우 사용할 수 있습니다

[d['value'] for d in l if 'value' in d]

8
키의 결 측값을 처리하기 위해 d.get ( "key_to_lookup", "alternate_value")을 사용할 수도 있습니다. [d.get ( 'value', 'alt') in d in l]와 같이 보입니다. 값이 키로 존재하지 않으면 단순히 'alt'를 반환합니다.
abhinav

솔루션에 감사드립니다
Ajay Kumar

이 "마술은"목록의 이해로 알려져있다 docs.python.org/3/tutorial/...
윌리엄 Ardila

34

map () 및 lambda 함수를 사용하여 수행하는 다른 방법은 다음과 같습니다.

>>> map(lambda d: d['value'], l)

여기서 l은 목록입니다. 나는이 방법이 "가장 섹시한"것을 본다.

업데이트 : 주요 용도로 '값'이 누락 된 경우 :

>>> map(lambda d: d.get('value', 'default value'), l)

업데이트 : 나는 또한 람다의 큰 팬이 아니며, 이름을 짓는 것을 선호합니다 ... 이것이 내가 그것을 염두에두고하는 방법입니다 :

>>> import operator
>>> map(operator.itemgetter('value'), l)

더 나아가서 달성하고자하는 것을 명시 적으로 나타내는 유일한 기능을 만들었습니다.

>>> import operator, functools
>>> get_values = functools.partial(map, operator.itemgetter('value'))
>>> get_values(l)
... [<list of values>]

Python 3에서는 map반복자 list를 반환 하므로을 사용 하여 목록을 반환하십시오 (예 :) list(map(operator.itemgetter('value'), l)).


1
심한! 목록 이해력이 여기에 훨씬 더 합리적입니다.
Mike Graham

4
첫 번째 사용하려고하는 경우 map, 사용 operator.itemgetter('value')이 아닌를 lambda.
agf

18
[x['value'] for x in list_of_dicts]

또는 [dict_list에서 d에 대한 d.getkey ( 'value')]
rplnt

1
@rpInt 음, getkey.. 같은 것은 없습니다 d.get('value'). 그것은 Michal이 아니라 @isbadawi의 두 번째 목록 이해와 동일합니다.
agf

3
예, 미안합니다. 그리고 키가 없으면 예외가 발생하지 않는 것으로 의미했습니다. 그러나 @isbadawi의 솔루션은 키가 없을 때 get ()이 None (또는 기본값으로 지정한 것)을 제공하므로 더 좋습니다.
rplnt

5

이와 같은 매우 간단한 경우, Ismail Badawi의 답변 에서와 같이 이해력 이 분명히 길입니다.

그러나 상황이 더 복잡해지고 복잡한 표현이 포함 된 다중 절 또는 중첩 이해를 작성해야하는 경우 다른 대안을 살펴볼 가치가 있습니다. JSONPath, DPath 및 KVC와 같은 중첩 된 dict-and-list 구조에서 XPath 스타일 검색을 지정하는 몇 가지 (준) 표준 방법이 있습니다. PyPI에는 멋진 라이브러리가 있습니다.

다음은 라이브러리 이름 dpath이 약간 더 복잡한 것을 단순화하는 방법을 보여주는 예입니다 .

>>> dd = {
...     'fruits': [{'value': 'apple', 'blah': 2}, {'value': 'banana', 'blah': 3}],
...     'vehicles': [{'value': 'cars', 'blah':4}]}

>>> {key: [{'value': d['value']} for d in value] for key, value in dd.items()}
{'fruits': [{'value': 'apple'}, {'value': 'banana'}],
 'vehicles': [{'value': 'cars'}]}

>>> dpath.util.search(dd, '*/*/value')
{'fruits': [{'value': 'apple'}, {'value': 'banana'}],
 'vehicles': [{'value': 'cars'}]}

또는 다음을 사용하십시오 jsonpath-ng.

>>> [d['value'] for key, value in dd.items() for d in value]
['apple', 'banana', 'cars']
>>> [m.value for m in jsonpath_ng.parse('*.[*].value').find(dd)]
['apple', 'banana', 'cars']

이 항목은 언뜻보기에는 그리 단순하지 않을 수 있습니다 find. 각 항목으로 직접 연결되는 경로와 같이 일치하는 값 외에 모든 종류의 항목을 포함하는 일치 객체를 반환 하기 때문 입니다. 그러나보다 복잡한 표현식의 경우 '*.[*].value'각각에 대해 이해 절 대신 경로를 지정할 수 있으면 *큰 차이가 있습니다. 또한 JSONPath는 언어에 구애받지 않는 사양이며 디버깅에 매우 유용한 온라인 테스터 도 있습니다.


1

나는 당신이 찾고있는 것을 당신에게 줄 것입니다.

In[5]: ll = [{'value': 'apple', 'blah': 2}, {'value': 'banana', 'blah': 3} , {'value': 'cars', 'blah':4}]
In[6]: ld = [d.get('value', None) for d in ll]
In[7]: ld
Out[7]: ['apple', 'banana', 'cars']

당신의 조합으로이 작업을 수행 할 수 maplambda도 있지만, 지능형리스트의 외모가 더 우아하고 파이썬.

더 작은 입력 목록의 경우 이해가 진행되지만 입력이 실제로 큰 경우 발전기가 이상적인 방법이라고 생각합니다.

In[11]: gd = (d.get('value', None) for d in ll)
In[12]: gd
Out[12]: <generator object <genexpr> at 0x7f5774568b10>
In[13]: '-'.join(gd)
Out[13]: 'apple-banana-cars'

더 큰 입력을 위해 가능한 모든 솔루션을 비교 한 내용은 다음과 같습니다.

 In[2]: l = [{'value': 'apple', 'blah': 2}, {'value': 'banana', 'blah': 3} , {'value': 'cars', 'blah':4}] * 9000000
In[3]: def gen_version():
  ...:     for i in l:
  ...:         yield i.get('value', None)
  ...: 
In[4]: def list_comp_verison():
  ...:     return [i.get('value', None) for i in l]
  ...: 
In[5]: def list_verison():
  ...:     ll = []
  ...:     for i in l:
  ...:         ll.append(i.get('value', None))
  ...:     return ll
In[10]: def map_lambda_version():
   ...:      m = map(lambda i:i.get('value', None), l)
   ...:      return m
   ...: 
In[11]: %timeit gen_version()
172 ns ± 0.393 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
In[12]: %timeit map_lambda_version()
203 ns ± 2.31 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In[13]: %timeit list_comp_verison()
1.61 s ± 20.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In[14]: %timeit list_verison()
2.29 s ± 4.58 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

보다시피, 제너레이터는 다른 제너레이터에 비해 더 나은 솔루션이며,지도는 OP에 맡겨야하는 이유 때문에 제너레이터보다 맵이 느립니다.


1

예를 따르십시오-

songs = [
{"title": "happy birthday", "playcount": 4},
{"title": "AC/DC", "playcount": 2},
{"title": "Billie Jean", "playcount": 6},
{"title": "Human Touch", "playcount": 3}
]

print("===========================")
print(f'Songs --> {songs} \n')
title = list(map(lambda x : x['title'], songs))
print(f'Print Title --> {title}')

playcount = list(map(lambda x : x['playcount'], songs))
print(f'Print Playcount --> {playcount}')
print (f'Print Sorted playcount --> {sorted(playcount)}')

# Aliter -
print(sorted(list(map(lambda x: x['playcount'],songs))))

1

파이썬 사전 목록에서 주요 값을 얻으시겠습니까?

  1. 파이썬 사전 목록에서 주요 값을 얻으시겠습니까?

전의:

data = 
[{'obj1':[{'cpu_percentage':'15%','ram':3,'memory_percentage':'66%'}]},
{'obj2': [{'cpu_percentage':'0','ram':4,'memory_percentage':'35%'}]}]

데이터에서 d의 경우 :

  for key,value in d.items(): 

      z ={key: {'cpu_percentage': d['cpu_percentage'],'memory_percentage': d['memory_percentage']} for d in value} 
      print(z)

산출:

{'obj1': {'cpu_percentage': '15%', 'memory_percentage': '66%'}}
{'obj2': {'cpu_percentage': '0', 'memory_percentage': '35%'}}

-2

가장 간단한 방법은 다음과 같습니다.

list1=['']
j=0
for i in com_list:
    if j==0:
        list1[0]=(i['value'])
    else:
        list1.append(i['value'])
    j+=1

산출:

[ '사과', '바나나', '자동차']

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.