如何在Python列表中总结类似的值

时间:2017-04-21 23:31:29

标签: python python-2.7

我有一个包含以下数据的python列表:

['Tom', 'Smith', '1'] 
['Tom', 'Miller', '7'] 
['Tom', 'Smith', '2'] 
['Tom', 'Miller', '3'] 

我想对重复数据进行重复数据删除和总结,因此最终结果如下所示:

['Tom', 'Smith', '3'] 
['Tom', 'Miller', '10'] 

对Python不熟悉我很难理解如何继续。我丑陋的解决方案涉及创建第二个列表并从第一个列表中删除匹配并添加它并将其放入新列表中的所有项目。但是我在那里的某些地方迷路了。谢谢你的帮助。

3 个答案:

答案 0 :(得分:4)

与Darkstarone类似,但我使用defaultdict,并将密钥设为tuple

from collections import defaultdict

data = [['Tom', 'Smith', '1'],
        ['Tom', 'Miller', '7'],
        ['Tom', 'Smith', '2'],
        ['Tom', 'Miller', '3']]

output = defaultdict(int)
for datum in data:
    key = (datum[0], datum[1])
    output[key] += int(datum[2])

答案 1 :(得分:0)

我的建议是使用dict结构:

data = [['Tom', 'Smith', '1'], 
['Tom', 'Miller', '7'], 
['Tom', 'Smith', '2'], 
['Tom', 'Miller', '3']]

results = {}

for l in data:
    name = l[0] + " " + l[1]
    if name in results:
        results[name] += int(l[2])
    else:
        results[name] = int(l[2])

# Results: {'Tom Miller': 10, 'Tom Smith': 3}

如果您想维护名称的顺序(正常的决定不要这样做),您可以使用OrderedDict

import collections

data = [['Tom', 'Smith', '1'], 
['Tom', 'Miller', '7'], 
['Tom', 'Smith', '2'], 
['Tom', 'Miller', '3']]

results = collections.OrderedDict()

for l in data:
    name = l[0] + " " + l[1]
    if name in results:
        results[name] += int(l[2])
    else:
        results[name] = int(l[2])

如果你需要结果在最后使用相同的列表格式(在制作dict之后添加它):

results_list = []
for k,v in results.iteritems():
    group = []
    group.extend(k.split())
    group.append(str(v))
    results_list.append(group)

答案 2 :(得分:0)

你可以通过pandas库实现这一目标:

import pandas as pd
import numpy as np

df = pd.DataFrame({'col': [['Tom', 'Smith', '1'], ['Tom', 'Miller', '7'], ['Tom', 'Smith', '2'], ['Tom', 'Miller', '3']]})

df['name'] = ['{0} {1}'.format(x, y) for x, y in list(zip([x[0] for x in df['col']], [x[1] for x in df['col']]))]
df['val'] = [int(x[2]) for x in df['col']]

df.groupby('name')['val'].agg(np.sum)

返回:

Tom Miller    10
Tom Smith      3
Name: val, dtype: int64