组合第二个元素相同的python子列表,并返回第二个元素的和

组合第二个元素相同的python子列表,并返回第二个元素的和,python,Python,如果子列表的第二个元素相同,如何从子列表返回单个列表。e、 g 给你一张单子 a = [ [1442, '17-10-17'], [5437, '19-11-17'], [5778, '27-11-17'], [5901, '27-11-17'], [5875, '27-11-17'], [5947, '28-11-17'] ] 它应该会回来 [ [1442, '17-10-17'], [5437, '19-11-17'], [a[2][0] + a[3][0] + a[4][0],

如果子列表的第二个元素相同,如何从子列表返回单个列表。e、 g

给你一张单子

a = [
[1442, '17-10-17'],
[5437, '19-11-17'],
[5778, '27-11-17'],
[5901, '27-11-17'],
[5875, '27-11-17'],
[5947, '28-11-17']
    ]
它应该会回来

[
[1442, '17-10-17'],
[5437, '19-11-17'],
[a[2][0] + a[3][0] + a[4][0], '27-11-17'],
[5947, '28-11-17']
]

使用
collections.defaultdict

from collections import defaultdict

d_dict = defaultdict(int)
for k,v in a:
    d_dict[v] += k

[[v,k] for k,v in d_dict.items()]
输出:

[[1442, '17-10-17'],
 [5437, '19-11-17'],
 [17554, '27-11-17'],
 [5947, '28-11-17']]

这将完成所需的转换:

from collections import OrderedDict

b = OrderedDict()
for x, y in a:
    b.setdefault(y, 0)  #This will ensure every new key is initialised with zero
    b[y] += x           #This will add the corresponding value to zero or previous sum

a = [[y, x] for x, y in b.items()]
输出将是:

[[1442, '17-10-17'],
 [5437, '19-11-17'],
 [17554, '27-11-17'],
 [5947, '28-11-17']]

我知道你想要一个列表,但你可以用字典来做——我个人认为这是一个更好的方法

原始问题答案 让我们看看您的示例变量:

a = [
[1442, '17-10-17'],
[5437, '19-11-17'],
[5778, '27-11-17'],
[5901, '27-11-17'],
[5875, '27-11-17'],
[5947, '28-11-17']
 ]
然后我们把它运行一遍

dates = {}
for item in zip([item[0] for item in a], [item[1] for item in a]):
    val, date = item
    try:
        dates[date].append(val)
    except KeyError:
        dates[date]  = [val]
这将返回:

{'17-10-17': [1442], '19-11-17': [5437], '27-11-17': [5778, 5901, 5875], '28-11-17': [5947]}
要对这些数组求和并保持字典格式,请执行以下操作:

for key, value in dates.items():
    dates[key] = [sum(value)]
如果您希望将其转换回列表:

for key, value in dates.items():
    dates_list.append([sum(value), key])
现在
dates_list=[1442',17-10-17',[5437',19-11-17',[17554',27-11-17',[5947',28-11-17']


更新的问题答案 如果数组如下所示:

a = [
[1442, '17-10-17', 'a'],
[5437, '19-11-17', 'b'],
[5778, '27-11-17', 'c'],
[5901, '27-11-17', 'c'],
[5875, '27-11-17', 'd'],
[5947, '28-11-17', 'd']
 ]
然后我们运行:

a = [[n[0], [n[2], n[1]]] for n in a]
现在是主代码的编辑版本:

dates = {}
for item in zip([item[0] for item in a], [item[1] for item in a]):
    val, date = item
    try:
        dates[tuple(date)].append(val)
    except KeyError:
        dates[tuple(date)]  = [val]
然后将其转换回您最初想要的格式:

dates_list = []
for key, value in dates.items():
    dates_list.append([sum(value), *key])
完整代码为:

a = [
[1442, '17-10-17', 'a'],
[5437, '19-11-17', 'b'],
[5778, '27-11-17', 'c'],
[5901, '27-11-17', 'c'],
[5875, '27-11-17', 'd'],
[5947, '28-11-17', 'd']
 ]

a = [[n[0], [n[2], n[1]]] for n in a]


dates = {}
print(list(zip([item[0] for item in a], [item[1] for item in a])))

for item in zip([item[0] for item in a], [item[1] for item in a]):
    val, date = item
    try:
        dates[tuple(date)].append(val)
    except KeyError:
        dates[tuple(date)]  = [val]
    print('val=',val , 'date=', date)
print(dates)

dates_list = []
for key, value in dates.items():
    dates_list.append([sum(value), *key])
    print('key=',key,'value=',value)
print(dates_list)

谢谢你的回答。我忘了在列表中添加一些其他细节,所以如果这是输入
a=[[1442,'17-10-17','a'],[5437,'19-11-17','b'],[5778,'27-11-17','c'],[5901,'27-11-17','c'],[5875,'27-11-17','c'],[5947,'28-11-17','d']
从子列表返回一个列表,其中子列表的第二个和第三个元素是相同的,但我忘了在该列表中添加一些其他细节,因此如果这是输入
a=[[1442,'17-10-17','a'],[5437,'19-11-17','b'],[5778,'27-11-17','c'],[5901,'27-11-17,'c'],[5875,'27-11-17','c'],[5947,'28-11-17','d'].
很抱歉,您没有在问题中指定这一点-也许您应该编辑您的问题以包括这一点…正确,我没有指定,现在我已经指定了。我在底部添加了一种使用数据集的方法。希望它对您有用:)