簡體   English   中英

如果列表中的第一個元素匹配,如何對列表的第二個元素求和

[英]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.groupbyreduce和 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM