2016-07-26 5 views
-2

고유 한 값이 스택 : 목록 : 중복 제거와 함께 나는이 유사한 목록이

[ 
    {'code': 'ABCDEFGH', 
    'message':'Everything is not OK', 
    'name': 'Tom Sawyer', 
    'course': 'Networks'}, 

    {'code': 'ABCDEFGH', 
    'message':'Alright', 
    'name': 'Julien Sorel', 
    'course': 'Networks'}, 

    {'code': 'KQPRADBC', 
    'message':'Hello there', 
    'name': 'Jacques Paganel', 
    'course': 'Cooking'}, 

    {'code': 'KQPRADBC', 
    'message':'Hello there', 
    'name': 'Jacques Paganel', 
    'course': 'Cooking'}, 
] 

을 그리고 나는 그것이 같이 할 :

그래서
[ 
    {'code': 'ABCDEFGH', 
    'message': ['Everything is not OK', 'Alright'], 
    'name': ['Tom Sawyer', 'Julien Sorel'], 
    'course': 'Networks'}, 

    {'code': 'KQPRADBC', 
    'message':'Hello there', 
    'name': 'Jacques Paganel', 
    'course': 'Cooking'}, 
] 

것은 완전히 중복 항목이 제거되고 고유 한 사전 값이있는 항목이 목록에 병합됩니다. 순서는 중요하지 않습니다.

이것은 나를 위해 거대한 해킹처럼 보입니다. 미리 감사드립니다.

! 파이썬 3.5!

+1

. 루프는 '코드'입력란을보고 새 입력란에서 고유한지 여부를 확인한 다음 적절하게 추가 (즉, 필요한 경우 다른 항목 비교)해야합니다. – BrandonM

+0

작성한 코드와 결과를 표시하십시오. 무엇이 효과가 있습니까? –

+0

@joelgoldstick 이것을 시도하는 방법에 대한 일반적인 아이디어가 필요했습니다 (삭제를 통해 해결해야한다고 생각했습니다). 그리고 Brandon이 저에게주었습니다. 나는이 방법을 시도 할 것이다. – light2yellow

답변

2

단순한 읽을 수있는 코드로 단일성을 보장하려면 세트를 사용할 수 있습니다. 코드의 주석을보십시오. lst을 가정하여 내가 제안

는, 사전의 목록이 포함 항목으로 사전 목록으로

res = list() # start from scratch 
for k in lst: 
    for d in res: # check the previously created entries 
     if d['code'] == k['code']: 
      # add to entry 
      for field in ['message', 'name', 'course']: 
       d[field].add(k[field]) # will not do anything if value is already here 
      break 
    else: # this will be executed if the for didn't break 
     # create new entry 
     tmp = {'code': k['code']} 
     for field in ['message', 'name', 'course']: 
      tmp[field] = set([k[field]]) 
     res.append(tmp) 
print res 

을, 나는 다음과 같은 얻을 :

[ 
{'course': set(['Networks']), 
'message': set(['Alright', 'Everything is not OK']), 
'code': 'ABCDEFGH', 
'name': set(['Julien Sorel', 'Tom Sawyer'])}, 

{'course': set(['Cooking']), 
'message': set(['Hello there']), 
'code': 'KQPRADBC', 
'name': set(['Jacques Paganel'])} 
] 

정확히 같은를 갖고 싶어 결과물을 질문에 적어 넣으면 마지막에 다음과 같이 추가 할 수 있습니다.

for d in res: 
    for field in ['message', 'name', 'course']: 
     if len(d[field]) > 1: 
      d[field] = list(d[field]) 
     else: 
      d[field] = list(d[field])[0] 
+0

도움을 많이 주셔서 감사합니다. 'else'에는 약간의 들여 쓰기 문제가 있습니다. – light2yellow

+1

아니요. 그것은 'for'와 동일한 수직선을 의미합니다.) 더 많은 깨달음을 얻으려면 [this] (http://psung.blogspot.com/2007/12/for-else-in-python.html)를보십시오 – BusyAnt

+0

오 . 저는 거기에있는 주석가 중 한 명을 인용 할 것입니다 : "와우, 나는 이걸 결코 알지 못했다!" – light2yellow

0
a = [ 
{'code': 'ABCDEFGH', 
'message':'Everything is not OK', 
'name': 'Tom Sawyer', 
'course': 'Networks'}, 

{'code': 'ABCDEFGH', 
'message':'Alright', 
'name': 'Julien Sorel', 
'course': 'Networks'}, 

{'code': 'KQPRADBC', 
'message':'Hello there', 
'name': 'Jacques Paganel', 
'course': 'Cooking'}, 

{'code': 'KQPRADBC', 
'message':'Hello there', 
'name': 'Jacques Paganel', 
'course': 'Cooking'}, 
] 
out=[] 
for i in set([tuple(d.items()) for d in a]): 
    out.append(dict(i)) 
print out 

출력 : 내가 솔루션이 다른 딕셔너리를 구축 루프를 작성하는 것이라고 생각

[{'course': 'Cooking', 'message': 'Hello there', 'code': 'KQPRADBC', 'name': 'Jacques Paganel'}, 
{'course': 'Networks', 'message': 'Everything is not OK', 'code': 'ABCDEFGH', 'name': 'Tom Sawyer'}, 
{'course': 'Networks', 'message': 'Alright', 'code': 'ABCDEFGH', 'name': 'Julien Sorel'}] 
관련 문제