组合第二个元素相同的python子列表,并返回第二个元素的和
如果子列表的第二个元素相同,如何从子列表返回单个列表。e、 g 给你一张单子组合第二个元素相同的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],
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'].
很抱歉,您没有在问题中指定这一点-也许您应该编辑您的问题以包括这一点…正确,我没有指定,现在我已经指定了。我在底部添加了一种使用数据集的方法。希望它对您有用:)