Python:从列表中删除重复项

时间:2014-11-12 02:43:03

标签: python list duplicates

从文件中读取一些数据并对其进行分类后,我就明白了。

[['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)

谢谢!

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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

输出是 [(&#39; John&#39;,6),(&#39; Lisa&#39;,2),(&#39; Carly&#39;,4),(&#39; Zacharry&#39;, 1),(&#39; Brian&#39;,3)]