2016-09-27 40 views
1

我有元組的列表:總人數由元組的列表信

[ ('A',100), ('B',50), ('A',50), ('B',20), ('C',10) ] 

我想概括起來有相同字母的所有號碼。即我想輸出

[('A', 150), ('B', 70), ('C',10)] 

我已經使用set來獲得獨特的價值觀,但後來當我嘗試和比較的第一要素的集合,我得到

TypeError: unsupported operand type(s) for +: 'int' and 'str' 

任何快速解決方案來滿足數字嘗試通過信?

+0

發佈你試過什麼讓更多的士氣那些閱讀您的問題 –

+0

它會被更好地格式化 – RPGillespie

+0

根據你的錯誤信息,你試圖將一個字符串和一個整數加在一起,這是非法的,沒有類型轉換。 – RPGillespie

回答

0

這裏是一個(半?) - 班輪:一組一個字母(你需要先排序),然後把你的元組的第二個條目的總和。

from itertools import groupby 
from operator import itemgetter 

data = [('A', 100), ('B', 50), ('A', 50), ('B', 20), ('C', 10)] 
res = [(k, sum(map(itemgetter(1), g))) 
     for k, g in groupby(sorted(data, key=itemgetter(0)), key=itemgetter(0))] 
print(res) 
// => [('A', 150), ('B', 70), ('C', 10)] 

上面是O(n log n)的—排序是最昂貴的操作。如果您的輸入列表是真正的大,你可能會得到更好的下面Ø服務(N)的方法:

from collections import defaultdict 

data = [('A', 100), ('B', 50), ('A', 50), ('B', 20), ('C', 10)] 

d = defaultdict(int) 
for letter, value in data: 
    d[letter] += value 
res = list(d.items()) 
print(res) 
// => [('B', 70), ('C', 10), ('A', 150)] 
0

爲了達到這個目的,首先創建一個字典來存儲你的值。然後dict對象轉換爲使用.items()下面tuple list是如何實現的示例代碼:

my_list = [ ('A',100), ('B',50), ('A',50), ('B',20), ('C',10) ] 
my_dict = {} 
for key, val in my_list: 
    if key in my_dict: 
     my_dict[key] += val 
    else: 
     my_dict[key] = val 

my_dict.items() 
# Output: [('A', 150), ('C', 10), ('B', 70)] 
0

如何:(假設a爲您提供的元組的名稱)

letters_to_numbers = {} 
for i in a: 
    if i[0] in letters_to_numbers: 
     letters_to_numbers[i[0]] += i[1] 
    else: 
     letters_to_numbers[i[0]] = i[1] 
b = letters_to_numbers.items() 

生成的元組b的元素將不會按特定順序排列。

+0

爲什麼downvotes?它沒有工作嗎? – QuantumFool

+0

有人downvoted每個答案 – jamylak

0

什麼是生成的元組的列表?是你嗎?如果是這樣,爲什麼不嘗試一個defaultdict(列表)在製作元組列表時將值附加到正確的字母。然後你可以簡單地總結它們。見下面的例子。

>>> from collections import defaultdict 
>>> val_store = defaultdict(list) 
>>> # next lines are me simulating the creation of the tuple 
>>> val_store['A'].append(10) 
>>> val_store['B'].append(20) 
>>> val_store['C'].append(30) 
>>> val_store 
defaultdict(<class 'list'>, {'C': [30], 'A': [10], 'B': [20]}) 
>>> val_store['A'].append(10) 
>>> val_store['C'].append(30) 
>>> val_store['B'].append(20) 
>>> val_store 
defaultdict(<class 'list'>, {'C': [30, 30], 'A': [10, 10], 'B': [20, 20]}) 

>>> for val in val_store: 
... print(val, sum(val_store[val])) 
... 
C 60 
A 20 
B 40 
-1

試試這個:

a = [('A',100), ('B',50), ('A',50), ('B',20), ('C',10) ] 

letters = set([s[0] for s in a]) 

new_a = [] 
for l in letters: 
    nums = [s[1] for s in a if s[0] == l] 
    new_a.append((l, sum(nums))) 

print new_a  

結果:

[('A', 150), ('C', 10), ('B', 70)] 
+0

有趣的人downvoted每個人在這裏 – jamylak

-1

更簡單的方法

x = [('A',100),('B',50),('A',50),('B',20),('C',10)] 
y = {} 
for _tuple in x: 
    if _tuple[0] in y: 
     y[_tuple[0]] += _tuple[1] 
    else: 
     y[_tuple[0]] = _tuple[1] 
print [(k,v) for k,v in y.iteritems()] 
-1

一個一個班輪:

>>> x = [ ('A',100), ('B',50), ('A',50), ('B',20), ('C',10) ] 
>>> { 
...  k: reduce(lambda u, v: u + v, [y[1] for y in x if y[0] == k]) 
...  for k in [y[0] for y in x] 
...  }.items() 
[('A', 150), ('C', 10), ('B', 70)] 
-1
>>> from collections import Counter 
>>> c = Counter() 
>>> for k, num in items: 
     c[k] += num 


>>> c.items() 
[('A', 150), ('C', 10), ('B', 70)] 

效率較低(但更好看的)一個襯版本:如果您在蜱「``」包裝你的代碼

>>> Counter(k for k, num in items for i in range(num)).items() 
[('A', 150), ('C', 10), ('B', 70)] 
+0

這是一個工作答案爲什麼負面投票? – jamylak