2017-12-27 12 views
0

나는 다음과 같은 형태로 JSON에서 생산 된 사전의 여러 milions의 목록을 가지고있다. 목록의 크기 (최대 10-100 개)와 비교할 때 실제로 복제본은 거의 없습니다. 나는 각각의 복제본에 대한 사전 (또는 마지막으로, 결정 론적으로 중요하지 않다)을 취하고 싶다 _id. JavaScript에서는 다음을 사용합니다 :Python - 복잡한 객체의 정렬 된 목록에서 중복을 제거 하시겠습니까?</p> <pre><code>{ "_id":XXX, "some_other":"fields", ... } </code></pre> <p>목록 안전 분류 중복 <code>_id</code>와 disctionaries이 <code>_id</code> 키 그러나이있다 할 필요가 :

list.sort((a,b)=>a._id>b._id?1:(a._id<b._id?-1:0)) 
    .filter((ent,i,arr)=>i==0||ent!=arr[i-1]) 

그러나 나는 필터의 python 변형이 항목의 색인에 액세스 할 수 없습니까? 비슷한 일을 파이썬에서 할 수있는 비슷한 방법이 있습니까? 나는 내가 원하는 방식으로이 목록을 정렬 할 수있게 해주는 sorted(...) 함수를 찾았지만, 다음과 같은 중복을 필터링하는 방법을 알지 못한다.

+0

당신이 sorted'와'filter''살펴 보았다?파이썬에는'map','filter','reduce' 구조체가 있습니다.'lambda args : '를 사용하여 Python (익숙하지 않은) 익명 함수 구문을 사용하여 상응하는 표현식을 작성할 수 있습니다. 필터링/매핑을 위해 자주 목록 이해력 (및 관련된 구문, 예를 들어'dict' comprehension,'set' comprehensions, 또는 generator expression)은 더 관용적 인 것으로 간주됩니다. –

답변

2

(이 항상 각 _id의 마지막 발생 계속됩니다) 중복을 제거하기 위해 사전을 사용하여 다음

d = {i['_id']: i for i in your_list} 

을 일종의 _id에 의해 그 값 :

list(sorted(d.values(), key=lambda i: i['_id'])) 
2

관용적 방법으로, 파이썬 , 다음과 같습니다

import itertools 
import operator 

get_id = operator.itemgetter('_id') #factory function: lambda x:x['_id'] 
grouped = itertools.groupby(sorted(json_data, key=get_id), get_id) 

result = [next(g) for k,g in grouped] 

참고, 내장 된 파이썬 sorted는 안정적인 일종이다, timsort라는 적응 형 병합 정렬을 사용합니다.

itertools은 다양한 유익한 반복자를 효율적으로 구현하는 매우 유용한 모듈입니다.

# [k for k, g in groupby('AAAABBBCCDAABBB')] --> A B C D A B 
# [list(g) for k, g in groupby('AAAABBBCCD')] --> AAAA BBB CC D     

당신은 (파이썬은 "조건식"에서) 파이썬 익명 함수와 삼항 연산자를 사용하여 자바 스크립트의 음역을 만들 수 있습니다 groupby는 그룹화 반복자입니다. key=str.lower :

키 각 목록 요소에서 비교 키를 추출하는 데 사용되는 하나 개의 인자의 기능을 지정 참고 비교기 기능을 사용하지 않는 파이썬의 sorted 기능은, 그것은 key-based function을 사용합니다. 값의 기본값은 None (요소 직접 비교)입니다. 파이썬이 여전히 자바 스크립트 버전과 유사하게 작동하는 cmp 인수에

사용할 수 있습니다 (예를 들어, -1 1을 반환, 0 함수)

cmp은 더 이상 사용되지 그리고 마지막으로 파이썬 3에서 제거 key에 찬성하여 사용

1

sorted, filtermap :

d = [ 
    { 
     "_id": 3, 
     "some_other": "a" 
    }, 
    { 
     "_id": 1, 
     "some_other": "b" 
    }, 
    { 
     "_id": 2, 
     "some_other": "c" 
    }, 
    { 
     "_id": 2, 
     "some_other": "d" 
    } 
] 

sorted_d = sorted(d, key=lambda x: x['_id']) 
map(
    lambda y: y[1], 
    filter(
     lambda x: True if x[0]==0 else sorted_d[x[0]]["_id"] != sorted_d[x[0]-1]["_id"], 
     enumerate(sorted_d) 
    ) 
) 

출력 :

[{'_id': 1, 'some_other': 'b'}, 
{'_id': 2, 'some_other': 'c'}, 
{'_id': 3, 'some_other': 'a'}]