나는 주어진 세트 목록을 가지고있다.
sets1 = [{1},{2},{1}]
이 목록에서 numpy를 사용하여 고유 한 요소를 찾으면 unique
, 나는 얻을
np.unique(sets1)
Out[18]: array([{1}, {2}, {1}], dtype=object)
보다시피 결과는 다음과 같이 잘못되었다 {1}
, 출력에서 반복되는 .
비슷한 요소를 인접하게 만들어 입력의 순서를 변경하면 이런 일이 발생하지 않습니다.
sets2 = [{1},{1},{2}]
np.unique(sets2)
Out[21]: array([{1}, {2}], dtype=object)
왜 이런 일이 발생합니까? 아니면 내가 한 방식에 문제가 있습니까?
답변
여기서 발생하는 것은 np.unique
함수가 자체적으로 메소드를 사용하는 np._unique1d
NumPy 의 함수 ( 여기 코드 참조 )를 기반으로 한다는 .sort()
것입니다.
이제 각 세트에 하나의 정수만 포함 된 세트 목록을 정렬해도 세트에있는 정수 값에 따라 각 세트 의 목록 이 생성되지 않습니다 . 그래서 우리는 (그리고 우리가 원하는 것이 아닙니다) :
sets = [{1},{2},{1}]
sets.sort()
print(sets)
# > [{1},{2},{1}]
# ie. the list has not been "sorted" like we want it to
이제 지적했듯이 세트 목록이 원하는 방식으로 이미 주문 된 경우 np.unique
사전에 목록을 정렬 했으므로 작동합니다.
하나의 특정 솔루션 (각각 단일 정수를 포함하는 세트 목록에서만 작동 함)은 다음과 같습니다.
np.unique(sorted(sets, key=lambda x: next(iter(x))))
답변
set은 해싱 할 수없는 유형이기 때문에
{1} is {1} # will give False
collections.Counter
아래와 같이 세트를 튜플로 변환 할 수 있다면 파이썬 을 사용할 수 있습니다
from collections import Counter
sets1 = [{1},{2},{1}]
Counter([tuple(a) for a in sets1])