[英]Finding the sum of first two elements in a list and the second two elements and so on?
[英]How to sum the second elements of the list if the first elements in the list are matching
輸入:
[["US", 2], ["UK", 3], ["FR", 4], ["US", 2], ["US", 2], ["UK", 2]]
輸出:
[["US", 6], ["UK", 5], ["FR", 4]]
如果列表中的第一個元素匹配,我想對列表的第二個元素求和。 我試過使用字典和集合,但我想不出一個邏輯。 這可以在 Hadoop 或 Spark 中輕松完成,因為框架將采用 reduce 部分,我們可以輕松地對值列表求和。 但我不知道如何在 python 中做。 有人可以幫忙嗎?
注意:我正在尋找優化的解決方案。 沒有使用很多 for 循環。
import collections
l1 = [["US", 2], ["UK", 3], ["FR", 4]]
l2 = [["US", "us@mail.com"], ["UK", "uk@mail.com"], ["BR", "fr@mail.com"]]
l1 = dict(l1)
l2 = dict(l2)
l1set = set(l1.keys())
l2set = set(l2.keys())
for i in l1set & l2set:
print l2[i]
import collections as co
l = [["US", 2], ["UK", 3], ["FR", 4], ["US", 2], ["US", 2], ["UK", 2]]
dd = co.defaultdict(int)
for i in l:
dd[i[0]] += i[1]
newlist = [list((k,v)) for k,v in dd.items()]
結果:
>>> newlist
[['FR', 4], ['UK', 5], ['US', 6]]
編輯:
如果您可以使用pandas ,請按照https://stackoverflow.com/a/38497749/42346執行以下操作:
import pandas as pd
newlist = [list((k,v)) for k,v in pd.DataFrame(l,columns=['a','b']).groupby('a').b.sum().to_dict().items()]
結果:
>>> newlist
[['FR', 4], ['US', 6], ['UK', 5]]
做一個列表理解:
myNewList = [i for i in listOne if i in listTwo]
下面是一個例子:
listOne = [2, 4, 5, 7]
listTwo = [2, 3, 5, 6]
print ([i for i in listOne if i in listTwo])
# prints [2, 5]
這是我用你的兩個列表運行它時得到的:
$ python test.py
[['FR', 4]]
首先,如果你不知道怎么做,你不需要優化,但我會給自己一個 5 秒的挑戰來回答你的問題:)
from collections import defaultdict
b=defaultdict(int)
a=[["US", 2], ["UK", 3], ["FR", 4], ["US", 2], ["US", 2], ["UK", 2]]
for i in a: b[i[0]]+=i[1]
#now the way you access your sum is
print b['UK'] #prints 5
#if you specificlly need that format
output = [[n,b[n]] for n in b]
您可以使用itertools.groupby
、 reduce
和 list itertools.groupby
的組合,如下所示:
a = [["US", 2], ["UK", 3], ["FR", 4], ["US", 2], ["US", 2], ["UK", 2]]
a.sort()
b = []
for k, g in groupby(a, lambda x: x[0]):
b.append([k, reduce(lambda p, c: p + c, [y[1] for y in g])])
按名稱將它們分組,將每組的數字相加:
from itertools import groupby
from operator import itemgetter
my_list = [["US", 2], ["UK", 3], ["FR", 4], ["US", 2], ["US", 2], ["UK", 2]]
summary_list = []
for name, group in groupby(sorted(my_list), key=itemgetter(0)):
summary_list.append([name, sum(item[1] for item in group)])
print(summary_list)
輸出:
Python 3.5.1 (default, Dec 2015, 13:05:11)
[GCC 4.8.2] on linux
[['FR', 4], ['UK', 5], ['US', 6]]
在線試用: https : //repl.it/Ceh6/1
從這個開始:
ll =[["US", 2], ["UK", 3], ["FR", 4], ["US", 2], ["US", 2], ["UK", 2]]
試試這個:
dd = {k:0 for k in dict(ll).keys()}
for x in ll: dd[x[0]] += x[1]
dd
{'FR': 4, 'UK': 5, 'US': 6}
[[k,v] for k,v in dd.iteritems()]
[['FR', 4], ['US', 6], ['UK', 5]]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.