在Python中对列表列表中的元素求和
我有以下类型的列表:在Python中对列表列表中的元素求和,python,python-3.x,Python,Python 3.x,我有以下类型的列表: myList = [[500, 5], [500, 10], [500, 3], [504, 9], [505, 10], [505, 20]] 我不想让值具有相同的第一个元素,所以我想这样做:如果两个或多个元素具有相同的第一个值,则使用相同的第一个值对元素的所有第二个值求和,并删除重复项,因此在我的示例中,新的输出将是: myList = [[500, 18], [504, 9], [505, 30]] 我该怎么做?我曾想过使用Lambda函数,但我不知道如何创建函数
myList = [[500, 5], [500, 10], [500, 3], [504, 9], [505, 10], [505, 20]]
我不想让值具有相同的第一个元素,所以我想这样做:如果两个或多个元素具有相同的第一个值,则使用相同的第一个值对元素的所有第二个值求和,并删除重复项,因此在我的示例中,新的输出将是:
myList = [[500, 18], [504, 9], [505, 30]]
我该怎么做?我曾想过使用Lambda函数,但我不知道如何创建函数;我正在考虑的其他解决方案需要大量for循环,所以我在想是否有更简单的方法来实现这一点。感谢您的任何帮助 使用defaultdict:
使用defaultdict:
一个更易于阅读的实现较少的pythonesqe:
myList = [[500, 5], [500, 10], [500, 3], [504, 9], [505, 10], [505, 20]]
sums = dict()
for a,b in myList:
if a in sums:
sums[a] += b
else:
sums[a] = b
res = []
for key,val in sums.items():
res.append([key,val])
print (sorted(res))
一个更易于阅读的实现较少的pythonesqe:
myList = [[500, 5], [500, 10], [500, 3], [504, 9], [505, 10], [505, 20]]
sums = dict()
for a,b in myList:
if a in sums:
sums[a] += b
else:
sums[a] = b
res = []
for key,val in sums.items():
res.append([key,val])
print (sorted(res))
使用图书馆:
细分:
pd.DataFramemyList创建一个列表,其中每一行都是myList中的短列表之一:
0 1
0 500 5
1 500 10
2 500 3
3 504 9
4 505 10
5 505 20
..…groupby0[1]。按第一列求和,从第二列中获取值以创建一个而不是数据帧,并对其求和
[[k,v]for k,v in...........items]是一种简单的列表理解,将该系列视为一本词典,以您想要的形式输出回列表
输出:
[[500, 18], [504, 9], [505, 30]]
通过将每个项强制转换到列表中,可以缩短列表理解:
list(map(list, pd.DataFrame(myList).groupby(0)[1].sum().items()))
使用图书馆:
细分:
pd.DataFramemyList创建一个列表,其中每一行都是myList中的短列表之一:
0 1
0 500 5
1 500 10
2 500 3
3 504 9
4 505 10
5 505 20
..…groupby0[1]。按第一列求和,从第二列中获取值以创建一个而不是数据帧,并对其求和
[[k,v]for k,v in...........items]是一种简单的列表理解,将该系列视为一本词典,以您想要的形式输出回列表
输出:
[[500, 18], [504, 9], [505, 30]]
通过将每个项强制转换到列表中,可以缩短列表理解:
list(map(list, pd.DataFrame(myList).groupby(0)[1].sum().items()))
您可以使用itertools按子列表中的第一项对子列表进行分组,对子列表中的最后一个条目求和,并创建一个新的组键列表,其和为:
from itertools import groupby
from operator import itemgetter
#sort data
#unnecessary IMO, since data looks sorted
#it is however, required to sort data
#before running the groupby function
myList = sorted(myList, key = itemgetter(0))
我们的石斑鱼将是每个子列表500、504、505中的第一个项目
#iterate through the groups
#sum the ends of each group
#pair the sum with the grouper
#return a new list
result = [[key, sum(last for first, last in grp)]
for key, grp
in groupby(myList, itemgetter(0))]
print(result)
[[500, 18], [504, 9], [505, 30]]
您可以使用itertools按子列表中的第一项对子列表进行分组,对子列表中的最后一个条目求和,并创建一个新的组键列表,其和为:
from itertools import groupby
from operator import itemgetter
#sort data
#unnecessary IMO, since data looks sorted
#it is however, required to sort data
#before running the groupby function
myList = sorted(myList, key = itemgetter(0))
我们的石斑鱼将是每个子列表500、504、505中的第一个项目
#iterate through the groups
#sum the ends of each group
#pair the sum with the grouper
#return a new list
result = [[key, sum(last for first, last in grp)]
for key, grp
in groupby(myList, itemgetter(0))]
print(result)
[[500, 18], [504, 9], [505, 30]]
你试过什么?这有点简单,有几个循环,我可以用for循环,我只是想看看是否有较短的解决方案,你试过什么?这有点简单,有几个循环,我可以用for循环,只是我想看看是否有较短的解决方案使用defaultdict的正常方法是传递一个类型,因此defaultdict将与您的lambda相同。是的,这非常清楚!非常感谢,我会在7分钟内接受@JanChristofterasa您也不需要列表comp-只需将一个gen exp传递给sorted,例如:myDict.items中的sortedlistkv for kv要学究,新键不会初始化为零,而是尝试访问但尚未存在的键的值初始化为零。@SethMMorton这是正确的,我只是想在这里有一个简短的评论。如果有疑问,请阅读文档。使用defaultdict的正常方法是传递一个类型,因此defaultdict将与您的lambda相同。是的,这非常清楚!非常感谢,我会在7分钟内接受@JanChristofterasa您也不需要列表comp-只需将一个gen exp传递给sorted,例如:myDict.items中的sortedlistkv for kv要学究,新键不会初始化为零,而是尝试访问但尚未存在的键的值初始化为零。@SethMMorton这是正确的,我只是想在这里有一个简短的评论。如有疑问,请阅读文档。您可以将a,b=项目[0],项目[1]缩短为a,b=项目。还有更多:对于MyList中的a,b,您可以将a,b=项[0],项[1]缩短为a,b=项。还有更多:对于myListpandas中的a、b来说,这有点过分了,除非用户已经知道pandas,并且已经说过他们知道如何使用for循环,并且希望学习更简单的方法。好吧,学习如何处理收藏品或熊猫会让这些问题变得更容易。需要最少学习的方法是for循环-OP已经知道了…pandas有点过分了,除非用户已经知道pandas多个APIsOP已经说过他们知道如何使用for循环,并且希望学习更简单的方法。好吧,学习如何处理收藏品或熊猫会让这些问题变得更容易。需要最少学习的方法是for循环-OP已经知道了…这与Jean-Marc Volle的答案非常相似,除了结尾的列表比较这与Jean-Marc Volle的答案非常相似,除了结尾的列表比较