programing

임의 조건 함수에 따라 사전을 필터링하려면 어떻게 해야 합니까?

itsource 2022. 10. 14. 21:48
반응형

임의 조건 함수에 따라 사전을 필터링하려면 어떻게 해야 합니까?

다음과 같은 포인트 사전이 있습니다.

>>> points={'a':(3,4), 'b':(1,2), 'c':(5,5), 'd':(3,3)}

x와 y 값이 5보다 작은 모든 점, 즉 'a', 'b', 'd'로 새 사전을 만들고 싶습니다.

책에 따르면, 각 사전에는 다음이 있다.items()function: 목록을 반환한다.(key, pair)태플:

>>> points.items()
[('a', (3, 4)), ('c', (5, 5)), ('b', (1, 2)), ('d', (3, 3))]

그래서 이렇게 썼습니다.

>>> for item in [i for i in points.items() if i[1][0]<5 and i[1][1]<5]:
...     points_small[item[0]]=item[1]
...
>>> points_small
{'a': (3, 4), 'b': (1, 2), 'd': (3, 3)}

좀 더 우아한 방법은 없을까?파이썬이 정말 멋진 게임을 할 줄 알았는데dictionary.filter(f)기능...

딕트 억양을 사용할 수 있습니다.

{k: v for k, v in points.items() if v[0] < 5 and v[1] < 5}

Python 2에서는 2.7부터:

{k: v for k, v in points.iteritems() if v[0] < 5 and v[1] < 5}
dict((k, v) for k, v in points.items() if all(x < 5 for x in v))

전화하실 수도 있습니다..iteritems()대신.items()Python 2에 있고points엔트리가 많을 수도 있어요

all(x < 5 for x in v)각 점이 항상 2D일 수 있다는 것을 확실히 알고 있다면 과잉일 수 있습니다(이 경우 동일한 제약조건을 표현하여and정상적으로 동작합니다;-)

points_small = dict(filter(lambda (a,(b,c)): b<5 and c < 5, points.items()))
>>> points = {'a': (3, 4), 'c': (5, 5), 'b': (1, 2), 'd': (3, 3)}
>>> dict(filter(lambda x: (x[1][0], x[1][1]) < (5, 5), points.items()))

{'a': (3, 4), 'b': (1, 2), 'd': (3, 3)}
dict((k, v) for (k, v) in points.iteritems() if v[0] < 5 and v[1] < 5)

알렉스 마르텔리의 답변은 분명히 가장 우아한 방법이라고 생각합니다만, 슈퍼 어썸에 대한 당신의 욕구를 충족시킬 수 있는 방법을 추가하고 싶었을 뿐입니다.dictionary.filter(f)피토닉식 방법:

class FilterDict(dict):
    def __init__(self, input_dict):
        for key, value in input_dict.iteritems():
            self[key] = value
    def filter(self, criteria):
        for key, value in self.items():
            if (criteria(value)):
                self.pop(key)

my_dict = FilterDict( {'a':(3,4), 'b':(1,2), 'c':(5,5), 'd':(3,3)} )
my_dict.filter(lambda x: x[0] < 5 and x[1] < 5)

기본적으로 다음에서 상속되는 클래스를 만듭니다.dict는 필터 방식을 추가합니다.우리는 반드시 이 시스템을.items()필터링을 위해서, 를 사용하고 나서.iteritems()파괴적으로 반복하면 예외가 발생합니다.

dict((k, v) for (k, v) in points.iteritems() if v[0] < 5 and v[1] < 5)

언급URL : https://stackoverflow.com/questions/2844516/how-to-filter-a-dictionary-according-to-an-arbitrary-condition-function

반응형