사전 자르기
저는 사전을 가지고 있고, 그 일부를 키 목록(또는 튜플)에 의해 주어진 함수에 전달하고 싶습니다.이와 같은 경우:
# the dictionary
d = {1:2, 3:4, 5:6, 7:8}
# the subset of keys I'm interested in
l = (1,5)
이제 이상적으로 이 작업을 수행할 수 있습니다.
>>> d[l]
{1:2, 5:6}
하지만 그것은 작동하지 않습니다, 왜냐하면 그것은 튜플과 일치하는 키를 찾을 것이기 때문입니다.(1,5)
와 같은d[1,5]
.
d{1,5}
유효한 Python도 아닙니다(제가 알기로는...). 유용할 수도 있습니다.곱슬곱슬한 중괄호는 정렬되지 않은 세트 또는 사전을 제안하므로 지정된 키가 포함된 사전을 반환하는 것이 매우 타당해 보입니다.
d[{1,5}]
또한 말이 될 것입니다("여기 키 집합이 있습니다, 일치하는 항목을 주세요").{1, 5}
해시할 수 없는 집합이므로 일치하는 키가 있을 수 없습니다. 물론 오류도 발생합니다.
제가 할 수 있다는 것을 압니다.
>>> dict([(key, value) for key,value in d.iteritems() if key in l])
{1: 2, 5: 6}
또는 다음과 같습니다.
>>> dict([(key, d[key]) for key in l])
좀 더 콤팩트하지만 더 나은 방법이 있을 거라고 생각합니다제가 좀 더 우아한 해결책을 놓쳤습니까?
(Python 2.7 사용)
Python 3에서 iiter 도구를 사용할 수 있습니다.islice
얇게 썰다dict.items()
반복자
import itertools
d = {1: 2, 3: 4, 5: 6}
dict(itertools.islice(d.items(), 2))
{1: 2, 3: 4}
참고: 이 솔루션은 특정 키를 고려하지 않습니다.내부 순서에 따라 슬라이스됩니다.d
Python 3.7+에서는 삽입 순서가 보장됩니다.
튜플을 통해 키가 딕트에 있는지 확인하고 그 반대가 아닌지 확인해야 합니다. 키가 존재하는지 확인하지 않고 딕트에 없으면 키 오류가 발생합니다.
print({k:d[k] for k in l if k in d})
일부 시간:
{k:d[k] for k in set(d).intersection(l)}
In [22]: %%timeit
l = xrange(100000)
{k:d[k] for k in l}
....:
100 loops, best of 3: 11.5 ms per loop
In [23]: %%timeit
l = xrange(100000)
{k:d[k] for k in set(d).intersection(l)}
....:
10 loops, best of 3: 20.4 ms per loop
In [24]: %%timeit
l = xrange(100000)
l = set(l)
{key: d[key] for key in d.viewkeys() & l}
....:
10 loops, best of 3: 24.7 ms per
In [25]: %%timeit
l = xrange(100000)
{k:d[k] for k in l if k in d}
....:
100 loops, best of 3: 17.9 ms per loop
방법을 모르겠다.{k:d[k] for k in l}
읽기 어렵거나 우아하지 않으며 모든 요소가 포함되어 있으면 상당히 효율적입니다.
사전을 슬라이스하려면 다음을 사용하여 튜플 목록으로 변환d.items()
목록을 잘라내어 사전을 만듭니다.
여기서.
d = {1:2, 3:4, 5:6, 7:8}
처음 2개의 아이템을 얻기 위해
first_two = dict(list(d.items())[:2])
첫째_둘
{1: 2, 3: 4}
집합을 사용하여 사전 보기에서 교차합니다.
l = {1, 5}
{key: d[key] for key in d.viewkeys() & l}
이것은 Python 2 구문이며, Python 3에서 사용합니다.d.keys()
.
이것은 여전히 루프를 사용하지만, 적어도 사전 이해는 훨씬 더 읽기 쉽습니다.집합 교차로를 사용하는 것은 매우 효율적입니다.d
또는l
큽니다.
데모:
>>> d = {1:2, 3:4, 5:6, 7:8}
>>> l = {1, 5}
>>> {key: d[key] for key in d.viewkeys() & l}
{1: 2, 5: 6}
쓰기 adict
키 목록을 "항목"으로 받아들이고 사전의 "항목"을 반환하는 하위 클래스:
class SliceableDict(dict):
default = None
def __getitem__(self, key):
if isinstance(key, list): # use one return statement below
# uses default value if a key does not exist
return {k: self.get(k, self.default) for k in key}
# raises KeyError if a key does not exist
return {k: self[k] for k in key}
# omits key if it does not exist
return {k: self[k] for k in key if k in self}
return dict.get(self, key)
용도:
d = SliceableDict({1:2, 3:4, 5:6, 7:8})
d[[1, 5]] # {1: 2, 5: 6}
또는 이 액세스 유형에 대해 별도의 방법을 사용하려면*
임의의 수의 인수를 허용합니다.
class SliceableDict(dict):
def slice(self, *keys):
return {k: self[k] for k in keys}
# or one of the others from the first example
d = SliceableDict({1:2, 3:4, 5:6, 7:8})
d.slice(1, 5) # {1: 2, 5: 6}
keys = 1, 5
d.slice(*keys) # same
set intersection
그리고.dict comprehension
서 할 수 .
# the dictionary
d = {1:2, 3:4, 5:6, 7:8}
# the subset of keys I'm interested in
l = (1,5)
>>>{key:d[key] for key in set(l) & set(d)}
{1: 2, 5: 6}
사전
d = {1:2, 3:4, 5:6, 7:8}
내가 관심 있는 키의 하위 집합
l = (1,5)
정답.
{key: d[key] for key in l}
로 변환하는 입니다.Series
개체를 선택한 다음 지정된 인덱스를 찾습니다.
>>> d = {1:2, 3:4, 5:6, 7:8}
>>> l = [1,5]
>>> import pandas as pd
>>> pd.Series(d).loc[l].to_dict()
{1: 2, 5: 6}
제 경우는 비교적 드문 경우일 수도 있지만, 그래도 누군가에게 도움이 될 경우(직접 OP는 아니지만) 여기에 게시합니다.
항목 수가 있는 사전을 자르는 방법을 검색하다가 이 문제를 발견했습니다.으로 저는 , 기으로저였즉가있사고었지문고, 값은문나횟는횟수타나수나는습다, 니문자나타가자가는적본키전을자가).abababc
-->{'a': 3, 'b': 3, 'c': 1}
가장 일반적인 것을 반환할 수 있도록 사전을 '조각'하고 싶었습니다.n
열쇠들.
이것이 바로 Collections Counter 객체의 목적이며, 사전을 '절편'하는 대신 쉽게 컬렉션으로 변환할 수 있었습니다.카운터 후 콜most_common(n)
: https://docs.python.org/3/library/collections.html#collections.Counter.most_common
와 함께operator.itemgetter
:
dict(zip(l, itemgetter(*l)(d)))
numpy를 사용하여 딕트 슬라이스하기
d = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
dict(np.array([*d.items()])[[1,-2]]) # {'b': '2', 'c': '3'}
다양한 슬라이스 유형이 지원됩니다. https://numpy.org/doc/stable/user/basics.indexing.html 을 참조하십시오.
모듈 사전의 도움을 받아 사전 슬라이싱을 수행할 수 있습니다. 이것은 설명서 링크입니다. https://github.com/suryavenom/Flexi/blob/main/README.md .설치 - pip 설치 사전 확인
언급URL : https://stackoverflow.com/questions/29216889/slicing-a-dictionary
'programing' 카테고리의 다른 글
스프링 셸을 사용하여 스프링 부트 웹 애플리케이션에서 콘솔 명령을 빌드하는 방법은 무엇입니까? (0) | 2023.08.10 |
---|---|
단추를 링크처럼 만드는 방법은 무엇입니까? (0) | 2023.08.10 |
SQL Select 문에 부울 값 반환 (0) | 2023.08.10 |
오류 1045(28000) mysql을 중지할 수 없습니다. (0) | 2023.08.05 |
SQLFiddle에서 PL/SQL을 얻는 방법은 무엇입니까? (0) | 2023.08.05 |