IT Share you

해당 값을 기준으로 사전 키를 필터링하는 방법

shareyou 2020. 12. 10. 21:31
반응형

해당 값을 기준으로 사전 키를 필터링하는 방법


나는 가지고있다:

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( .iteritemsPython 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()

참고URL : https://stackoverflow.com/questions/10498132/how-to-filter-dictionary-keys-based-on-its-corresponding-values

반응형