첫 번째 N 키 반환: dict에서 값 쌍
다음 사전 d:
d = {'a': 3, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
d에서 첫 번째 N 키:값 쌍(이 경우 N < = 4)을 반환하려고 합니다.이것을 하는 가장 효율적인 방법은 무엇입니까?
다▁because▁"없니""이기 때문에 "첫 번째 n" 왜냐하면dict
어떤 키가 먼저 삽입되었는지 기억하지 못합니다.
다음과 같은 방법으로 n개의 키-값 쌍을 얻을 수 있습니다.
n_items = take(n, d.items())
은 이의구사니다용합의 합니다.take
요리법에서:
from itertools import islice
def take(n, iterable):
"""Return the first n items of the iterable as a list."""
return list(islice(iterable, n))
온라인 작업 보기: ideone
Python < 3.6의 경우
n_items = take(n, d.iteritems())
목록이나 사전 이해를 슬라이싱과 결합하는 것이 모든 것을 검색하는 매우 효율적인 방법입니다.항목을 주문할 필요가 없는 경우(랜덤 쌍만 원하는 경우) 다음과 같은 사전 이해도를 사용할 수 있습니다.
# Python 2
first2pairs = {k: mydict[k] for k in mydict.keys()[:2]}
# Python 3
first2pairs = {k: mydict[k] for k in list(mydict)[:2]}
일반적으로 이와 같은 이해는 "x in y의 경우" 루프보다 항상 실행 속도가 빠릅니다.또한 .keys()를 사용하여 사전 키 목록을 만들고 해당 목록을 슬라이스하면 새 사전을 작성할 때 불필요한 키를 '터치'하지 않아도 됩니다.
키(값만)가 필요하지 않은 경우 목록 이해도를 사용할 수 있습니다.
first2vals = [v for v in mydict.values()[:2]]
키를 기준으로 값을 정렬해야 하는 경우 더 이상 문제가 되지 않습니다.
first2vals = [mydict[k] for k in sorted(mydict.keys())[:2]]
또는 키가 필요한 경우:
first2pairs = {k: mydict[k] for k in sorted(mydict.keys())[:2]}
파이썬 사전에서 상위 N개 요소를 가져오려면 다음 코드 줄을 사용할 수 있습니다.
list(dictionaryName.items())[:N]
이 경우 다음으로 변경할 수 있습니다.
list(d.items())[:4]
파이의dict
s는 순서가 없으므로 "첫 번째 N" 키를 요청하는 것은 의미가 없습니다.
당신이 필요하다면 그 수업을 이용할 수 있습니다.처음 4가지 요소를 효율적으로 얻을 수 있습니다.
import itertools
import collections
d = collections.OrderedDict((('foo', 'bar'), (1, 'a'), (2, 'b'), (3, 'c'), (4, 'd')))
x = itertools.islice(d.items(), 0, 4)
for key, value in x:
print key, value
itertools.islice
에서는 반복기에서 요소 조각을 천천히 가져올 수 있습니다.결과를 재사용하려면 다음과 같은 목록으로 변환해야 합니다.
x = list(itertools.islice(d.items(), 0, 4))
foo = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5, 'f':6}
iterator = iter(foo.items())
for i in range(3):
print(next(iterator))
기본적으로 보기(dict_items)를 반복기로 전환한 다음 next()로 반복합니다.
전화를 걸어 사전 항목을 얻을 수 있습니다..items()
사전에그런 다음 그것을 a로 변환합니다.list
그리고 거기서 당신이 어떤 목록에 있든지 간에 먼저 N개의 아이템을 얻습니다.
아래 코드는 사전 객체의 처음 3개 항목을 인쇄합니다.
예.
d = {'a': 3, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
first_three_items = list(d.items())[:3]
print(first_three_items)
출력:
[('a', 3), ('b', 2), ('c', 3)]
파이3에서, 이것은 속임수를 쓸 것입니다.
{A:N for (A,N) in [x for x in d.items()][:4]}
{'a': 3, 'b': 2, 'c': 3, 'd': 4}
Python 3.8의 경우 정답은 다음과 같습니다.
import more_itertools
d = {'a': 3, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
first_n = more_itertools.take(3, d.items())
print(len(first_n))
print(first_n)
출력 대상:
3
[('a', 3), ('b', 2), ('c', 3)]
나 뒤에pip install more-itertools
물론이야.
이었다d
의 사전이고 당의사이고전입니다.n
번호입니다.
for idx, (k, v) in enumerate(d.items()):
if idx == n: break
print(k, v)
사전을 목록에 캐스팅하는 작업이 느릴 수 있습니다.
사전이 너무 클 수 있으므로 첫 번째 사전 몇 개를 인쇄하기 위해 모든 사전을 캐스팅할 필요는 없습니다.
여기서 못 봤어요.사전에서 일부 요소만 가져와야 하는 경우에는 순서가 지정되지 않고 구문적으로 가장 단순합니다.
n = 2
{key:value for key,value in d.items()[0:n]}
사전 정렬에 대한 자세한 내용은 PEP 0265를 참조하십시오.그런 다음 앞에서 언급한 반복 가능한 코드를 사용합니다.
정렬된 키-값 쌍에서 더 많은 효율성이 필요한 경우.다른 데이터 구조를 사용합니다.즉, 정렬된 순서와 키-값 연결을 유지하는 것입니다.
예.
import bisect
kvlist = [('a', 1), ('b', 2), ('c', 3), ('e', 5)]
bisect.insort_left(kvlist, ('d', 4))
print kvlist # [('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5)]
zip을 사용하여 답변을 추가합니다.
{k: d[k] for k, _ in zip(d, range(n))}
이것은 python 3.8+에서 작동할 것입니다.
d_new = {k:v for i, (k, v) in enumerate(d.items()) if i < n}
이는 귀하의 경우 '가장 효율적인' 것이 무엇인지에 따라 달라집니다.
한 사전의 반 ,foo
,사용하다foo.iteritems()
필요한 만큼의 값을 사용할 수 있으므로 키 또는 항목의 명시적인 목록이 생성되지 않도록 하는 게으른 작업입니다.
키를 먼저 정렬해야 하는 경우 다음과 같은 방법을 사용할 수 없습니다.keys = foo.keys(); keys.sort()
또는sorted(foo.iterkeys())
명확한 키 목록을 작성해야 합니다. 첫 N 그 다 슬 음 라 까 첫 번 N 지 합 니 다 반 복 째 는 또 런 이 스 ▁first ▁through 다 erate ▁or 니 ▁n ▁then 합 ▁it ▁slice 복 반 까 ▁n 다 음 keys
.
그나저나 당신은 왜 '효율적인' 방법에 관심이 있습니까?당신의 프로그램을 프로파일 했습니까?만약 그렇지 않다면, 먼저 분명하고 이해하기 쉬운 방법을 사용하세요.병목 현상이 발생하지 않고 잘 진행될 가능성이 높습니다.
Python 3 이상의 경우 첫 번째 n개 쌍을 선택하려면
n=4
firstNpairs = {k: Diction[k] for k in list(Diction.keys())[:n]}
이것은 그다지 우아하지 않을 수도 있지만, 저에게는 효과가 있습니다.
d = {'a': 3, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
x= 0
for key, val in d.items():
if x == 2:
break
else:
x += 1
# Do something with the first two key-value pairs
여러 가지 방법으로 접근할 수 있습니다.순서가 중요한 경우 다음을 수행할 수 있습니다.
for key in sorted(d.keys()):
item = d.pop(key)
주문이 문제가 되지 않는 경우 다음을 수행할 수 있습니다.
for i in range(4):
item = d.popitem()
사전은 순서를 유지하지 않으므로 상위 N개 키 값 쌍을 선택하기 전에 정렬합니다.
import operator
d = {'a': 3, 'b': 2, 'c': 3, 'd': 4}
d=dict(sorted(d.items(),key=operator.itemgetter(1),reverse=True))
#itemgetter(0)=sort by keys, itemgetter(1)=sort by values
이제 다음과 같은 메서드 구조를 사용하여 상위 'N'개 요소를 검색할 수 있습니다.
def return_top(elements,dictionary_element):
'''Takes the dictionary and the 'N' elements needed in return
'''
topers={}
for h,i in enumerate(dictionary_element):
if h<elements:
topers.update({i:dictionary_element[i]})
return topers
상위 2개 요소를 가져오려면 다음 구조를 사용합니다.
d = {'a': 3, 'b': 2, 'c': 3, 'd': 4}
d=dict(sorted(d.items(),key=operator.itemgetter(1),reverse=True))
d=return_top(2,d)
print(d)
구술을 고려하다.
d = {'a': 3, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
from itertools import islice
n = 3
list(islice(d.items(),n))
나는 슬라이스가 속임수를 할 것입니다 :) 도움이 되기를 바랍니다!
위의 답변 중 몇 가지를 시도해 보았지만 일부는 버전에 따라 다르며 버전 3.7에서는 작동하지 않습니다.
또한 3.6부터 모든 사전은 항목이 삽입되는 순서대로 정렬됩니다.
사전이 3.6부터 순서가 지정되었음에도 불구하고 순서가 지정된 구조로 작업할 것으로 예상되는 일부 문이 작동하지 않는 것 같습니다.
나에게 가장 잘 먹힌 OP 질문에 대한 답.
itr = iter(dic.items())
lst = [next(itr) for i in range(3)]
def GetNFirstItems(self):
self.dict = {f'Item{i + 1}': round(uniform(20.40, 50.50), 2) for i in range(10)}#Example Dict
self.get_items = int(input())
for self.index,self.item in zip(range(len(self.dict)),self.dict.items()):
if self.index==self.get_items:
break
else:
print(self.item,",",end="")
엄청난 O(N) 시간 복잡성을 제공하는 특이한 접근 방식입니다.
새로운 목록을 만들 필요가 없기 때문에 이 목록이 마음에 듭니다. 원하는 것을 정확히 수행하는 하나의 라이너이며 python >= 3.8(사전이 실제로 주문되는 곳에서는 python 3.6부터?)과 함께 작동합니다.
new_d = {kv[0]:kv[1] for i, kv in enumerate(d.items()) if i <= 4}
언급URL : https://stackoverflow.com/questions/7971618/return-first-n-keyvalue-pairs-from-dict
'programing' 카테고리의 다른 글
인수 구문:'x'가 있는 경우 'y' 인수가 필요합니다. (0) | 2023.06.11 |
---|---|
R에서 data.frame의 처음 4개 행을 선택합니다. (0) | 2023.06.11 |
노드가 없는 타이프스크립트 명령줄 컴파일제이에스 (0) | 2023.06.11 |
Ruby에서 범위로 배열을 채우는 올바른 방법 (0) | 2023.06.11 |
콜론을 사용하는 것과 유형을 선언하는 구문으로 사용하는 것의 차이점은 무엇입니까? (0) | 2023.06.11 |