2014-11-12 6 views
0

파일에서 일부 데이터를 읽고이를 통해 정렬 한 후이를 얻습니다.Python : 목록에서 중복 제거

[['John', 1], ['Lisa', 2], ['Carly', 2], ['Zacharry', 1], ['Brian', 3], ['John', 5], ['Carly', 2]] 

방법 또한 그들이 그렇게 내 출력 내가 총합으로 자신의 중복을 분리 할 수있었습니다이

[['John', 6], ['Lisa', 2], ['Carly', 4], ['Zacharry', 1], ['Brian', 3]] 

과 같을 것이다이 값을 추가하는 동안 나는 중복을 제거 할 수 데이터의, 그러나 나는 원하는 출력을 얻는 방법을 모른다.

참고 :

[['John', 6], ['Carly', 4]] 

내 코드 :

목록의 순서 내 경우에는 내가 내가이 출력을 얻을 수 중복을 격리 한 때 내 데이터 목록

에 유지하는 것이 중요합니다

def create_bills(filename, capacity): 
fob = open(filename) 
newlst = list() 
for line in fob: 
    a = line.split(" $") 
    b = [a[0], int(a[1])] 
    newlst.append(b) 
print(newlst) 
newlst2 = list() 
for i in range(len(newlst)): 
    n = i + 1 
    while n < len(newlst): 
     if newlst[i][0] == newlst[n][0]: 
      newlst2.append([newlst[i][0], (newlst[i][1] + newlst[n][1])]) 
     n += 1 
newlst3 = list() 
for i in range(len(newlst)): 
    pass 
print(newlst2) 

고맙습니다!

+0

복제본을 분리했다면 문제가 해결되었습니다! 우리가 한 일을 보여 주면 우리가 도와 줄 수있을 것입니다. – Rohmer

답변

1

답변을 제공해야합니다.

 
def out(a): 
    x={name:0 for name,value in a} 
    for name,value in a: 
     x[name]=x[name]+value 

    final=[] 
    for i in a: 
     if (i[0],x[i[0]]) not in final: 
      final.append((i[0],x[i[0]])) 
    return final 

출력은 [('존, 6), ('리사 ', 2), ('칼리 ', 4), ('Zacharry ', 1), (브라이언', 3)]

+0

원래 주문이 존재하지 않는다는 문제가 있습니다. – SirGoose

+0

왜 원래 주문을 보존해야합니까? 특별한 이유가 있습니까? – 277roshan

3

당신은 딕셔너리를 사용할 수 있습니다, 더 구체적으로 OrderedDict는 카운트를 추적하기 :

from collections import OrderedDict 
lst = [['John', 1], ['Lisa', 2], ['Carly', 2], ['Zacharry', 1], ['Brian', 3], ['John', 5], ['Carly', 2]] 
d = OrderedDict() 
for k, v in lst: 
    if k not in d: 
     d[k] = v 
    else: 
     d[k] += v 
print map(list, d.items()) 
#[['John', 6], ['Lisa', 2], ['Carly', 4], ['Zacharry', 1], ['Brian', 3]] 

코드의 가독성 문제를 제외하고, 당신이 목록의 수를 유지하는 경우가 O(N^2) 복잡성을 취 점에 유의하는 것이 중요합니다 원래 코드가하는 것과 같습니다. 사전 접근 방식은 O(N)입니다.

+0

이것은 굉장합니다! 고맙습니다. 질문 하나, 어떻게 대답을 인쇄물로 되돌릴 수 있습니까? "[Lisa, 2], [Carly], [4], [ 'Zacharry', 1], [ 'Brian', 3]]과 같은 것을 만들 수 있습니다. – SirGoose

+0

마지막 줄을 "print"에서 "return"으로 바꿀 수 있습니다. 코드를 함수에 넣었다고 가정하십시오. –

+0

죄송하지만 정확히 작동하지 않을 경우 출력은 다음과 같습니다. OrderedDict ([('John', 6), ('Lisa', 2), ('Carly', 4), ('Zacharry', 1) ('Brian', 3)]) – SirGoose