programing

사전 자르기

instargram 2023. 8. 10. 18:12
반응형

사전 자르기

저는 사전을 가지고 있고, 그 일부를 키 목록(또는 튜플)에 의해 주어진 함수에 전달하고 싶습니다.이와 같은 경우:

# 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}

참고: 이 솔루션은 특정 키를 고려하지 않습니다.내부 순서에 따라 슬라이스됩니다.dPython 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

반응형