2014-11-12 5 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), ('Brian', 3)]

+0

Проблема в том, что первоначального заказа нет – SirGoose

+0

Зачем вам нужно сохранить первоначальный заказ? Есть ли какая-то конкретная причина? – 277roshan

3

Вы можете использовать Dict, более конкретно 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

Это потрясающе сэр! Большое спасибо. Один вопрос, хотя, как я могу вернуть ответ, что вы напечатали? например, сделать что-то равным «[[« Джон », 6], [« Лиза », 2], [« Карли », 4], [Захарри, 1], ['Брайан', 3]]" – SirGoose

+0

Вы можете просто изменить последнюю строку от '' print'' до '' return'', если вы включили код в функцию. –

+0

Извините, но это точно не работает, выход становится этим OrderedDict ([('John', 6), ('Lisa', 2), ('Carly', 4), ('Zacharry', 1), ('Brian', 3)]) – SirGoose

Смежные вопросы