해당 값을 기준으로 사전 키를 필터링하는 방법
나는 가지고있다:
dictionary = {"foo":12, "bar":2, "jim":4, "bob": 17}
이 사전을 반복하고 싶지만 키 대신 값을 반복하여 다른 함수에서 값을 사용할 수 있습니다.
예를 들어 어떤 사전 값이보다 큰지 테스트 한 6
다음 해당 키를 목록에 저장하려고합니다. 내 코드는 다음과 같습니다.
list = []
for c in dictionary:
if c > 6:
list.append(dictionary[c])
print list
그런 다음 완벽한 세상에서 list
값이 6
. 그러나 내 for
루프는 키에 대해서만 반복됩니다. 나는 그것을 값으로 바꾸고 싶다!
어떤 도움이라도 대단히 감사합니다. 감사합니다
>>> d = {"foo": 12, "bar": 2, "jim": 4, "bob": 17}
>>> [k for k, v in d.items() if v > 6] # Use d.iteritems() on python 2.x
['bob', 'foo']
나는 요즘 사용하는 경향이있는 @glarrain의 솔루션을 보여주기 위해이 답변을 업데이트하고 싶습니다.
[k for k in d if d[k] > 6]
이것은 완전히 상호 호환되며 .iteritems
( .iteritems
Python 3에서 수정 된 Python 2의 메모리에 목록을 저장 하지 않음)에서으로 혼란스럽게 변경할 필요가 없습니다 .items
.
@ Prof.Falken이이 문제에 대한 해결책을 언급했습니다.
from six import iteritems
교차 호환성 문제를 효과적으로 해결하지만 패키지를 다운로드해야합니다. six
그러나 나는이 솔루션이 더 읽기 쉽고 토론의 여지가 있으며 Python이 한 가지 방법 만 가지고 있다고 가정하더라도 개인적인 선호도에 불과하다는 @glarrain에 완전히 동의하지는 않습니다. 제 생각에는 상황에 따라 다릅니다 (예 : 긴 사전 이름을 두 번 입력하고 싶지 않거나 값에 더 읽기 쉬운 이름 또는 다른 이유를 부여하려는 경우)
몇 가지 흥미로운 타이밍 :
Python 2에서는 두 번째 솔루션이 더 빠르며 Python 3에서는 원시 속도가 거의 동일합니다.
$ python -m timeit -s 'd = {"foo": 12, "bar": 2, "jim": 4, "bob": 17};' '[k for k, v in d.items() if v > 6]'
1000000 loops, best of 3: 0.772 usec per loop
$ python -m timeit -s 'd = {"foo": 12, "bar": 2, "jim": 4, "bob": 17};' '[k for k, v in d.iteritems() if v > 6]'
1000000 loops, best of 3: 0.508 usec per loop
$ python -m timeit -s 'd = {"foo": 12, "bar": 2, "jim": 4, "bob": 17};' '[k for k in d if d[k] > 6]'
1000000 loops, best of 3: 0.45 usec per loop
$ python3 -m timeit -s 'd = {"foo": 12, "bar": 2, "jim": 4, "bob": 17};' '[k for k, v in d.items() if v > 6]'
1000000 loops, best of 3: 1.02 usec per loop
$ python3 -m timeit -s 'd = {"foo": 12, "bar": 2, "jim": 4, "bob": 17};' '[k for k in d if d[k] > 6]'
1000000 loops, best of 3: 1.02 usec per loop
그러나 이것들은 작은 사전에 대한 테스트 일 뿐이며, 거대한 사전에서는 사전 키 조회 ( d[k]
)가없는 것이 .items
훨씬 더 빠를 것이라고 확신 합니다. 그리고 이것이 사실 인 것 같습니다
$ python -m timeit -s 'd = {i: i for i in range(-10000000, 10000000)};' -n 1 '[k for k in d if d[k] > 6]'
1 loops, best of 3: 1.75 sec per loop
$ python -m timeit -s 'd = {i: i for i in range(-10000000, 10000000)};' -n 1 '[k for k, v in d.iteritems() if v > 6]'
1 loops, best of 3: 1.71 sec per loop
$ python3 -m timeit -s 'd = {i: i for i in range(-10000000, 10000000)};' -n 1 '[k for k in d if d[k] > 6]'
1 loops, best of 3: 3.08 sec per loop
$ python3 -m timeit -s 'd = {i: i for i in range(-10000000, 10000000)};' -n 1 '[k for k, v in d.items() if v > 6]'
1 loops, best of 3: 2.47 sec per loop
값을 얻으려면 다음을 사용하십시오. dictionary.values()
키 값 쌍을 얻으려면 dictionary.items()
items
또는 iteritems
사전에 사용하십시오 . 다음과 같은 것 :
list = []
for k, v in dictionary.iteritems():
if v > 6:
list.append(k)
print list
이건 어때:
dictionary = {"foo":12, "bar":2, "jim":4, "bob": 17}
for val in dictionary.values():
# do something
이 작업을 수행하는 가장 좋은 방법 (Python 3으로의 마이그레이션 고려)은 다음과 같습니다.
>>> mydict = {'foo': 12, 'bar': 2, 'jim': 4, 'bob': 17}
>>> [k for k in mydict if mydict[k] > 6]
['bob', 'foo']
"최고"의 기준은 가독성입니다.
(면책 조항 : 내 대답은 Alex Martelli의 다른 질문 https://stackoverflow.com/a/3744713/556413 및 @jamylak 의이 질문에 대한 답변을 기반으로 함)
It depends if you would like to modify the dictionary (add or remove items) or not. If not then you could try:
for value in dictionary.itervalues(): #this returns a generator
print "do something with the value"
Alternatively if you modify the dictionary you should iterate over a copy of values:
for value in dictionary.values(): #this returns a list of values
print "do something with the value"
If you would like both keys and values you can iterate over pairs using dictionary.iteritems()
or dictionary.items()
'IT Share you' 카테고리의 다른 글
다른 네임 스페이스의 부분 클래스 (0) | 2020.12.10 |
---|---|
영구 테이블과 동일한 열 및 유형으로 임시 테이블을 만드는 가장 좋은 방법 (0) | 2020.12.10 |
HRESULT 예외 : 0x800A03EC 오류 (0) | 2020.12.10 |
Xcode Guard Malloc 및 장치 디버깅 : 'libgmalloc.dylib'이미지를 찾을 수 없음 (0) | 2020.12.10 |
iOS, Android 및 WP에서 개발하는 데 드는 비용은 얼마입니까? (0) | 2020.12.10 |