2016-07-22 12 views
-1

入力:リストの最初の要素が一致している場合はリストの2番目の要素を合計する方法

[["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]"]、 "UK"、 "[email protected]"]、[ "BR"、 "[email protected]"]] L1 = dictの(L1) L2 = dictの(L2) l1set =集合(L1。キー()) l2set =セット(l2.keys()) for i1lset&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]] 
関連する問題