2016-07-22 290 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]] 
相关问题