Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中对列表列表中的元素求和_Python_Python 3.x - Fatal编程技术网

在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的答案非常相似,除了结尾的列表比较