2016-07-22 287 views
-1

輸入:如何總結列表的第二個元素;如果在列表中的第一個元素匹配

[["US", 2], ["UK", 3], ["FR", 4], ["US", 2], ["US", 2], ["UK", 2]] 

輸出:

[["US", 6], ["UK", 5], ["FR", 4]] 

我要總結的名單,如果第二要素列表中的第一個元素是匹配的。我曾嘗試使用字典和集合,但我無法提出一個邏輯。這可以很容易地在Hadoop或Spark中完成,因爲框架將減少部分,並且我們可以輕鬆地總結值列表。但我不知道如何在python中完成。有人可以幫忙嗎?

注:我正在尋找優化的解決方案。不使用很多for循環。

什麼都試過了:

import collections 
l1 = [["US", 2], ["UK", 3], ["FR", 4]] 
l2 = [["US", "[email protected]"], ["UK", "[email protected]"], ["BR", "[email protected]"]] 
l1 = dict(l1) 
l2 = dict(l2) 
l1set = set(l1.keys()) 
l2set = set(l2.keys()) 
for i in l1set & l2set: 
    print l2[i] 
+2

請出示您的工作。你有什麼嘗試? –

+0

看來@bernie和我已經想出了不同的解決方案。你在找什麼結果? –

+0

你好@HaiVu,正如我所說我無法想出邏輯。但這是我爲簡單列表而嘗試的一個。進口集合 l1 = [[「US」,2],[「UK」,3],[「FR」,4]] l2 = [[「US」,「[email protected]」], 「英國」, 「[email protected]」],[ 「BR」, 「[email protected]」]] L1 =字典(L1) L2 =字典(L2) l1set =設定(L1。 ()) l2set = set(l2.keys()) for i in l1set&l2set: print l2 [i] –

回答

0
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.iteritems()] 

結果:

>>> 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().iteritems()] 

結果:

>>> newlist 
[['FR', 4], ['US', 6], ['UK', 5]] 
0

做一個列表理解:

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]] 
0

首先,如果你不知道該怎麼做,你不需要優化,但我給自己一個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] 
0

你可以使用的itertools.groupby組合, reduce和列表內涵,就像這樣:

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])]) 
0

集團通過他們的名字,總結的數字爲每個組:

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

0

與此開始:

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]] 
相關問題