簡體   English   中英

Python:迭代添加列表的相同元素

[英]Python : Adding the same elements of a list iteratively

我有下面列出的元素列表-

[(a,1),(b,2),(c,3),(d,4),(e,5),(f,6),(a,7),(b,8),(c,9),(d,10),(e,11),(f,12)]

我試圖將字母旁邊的值與相同字母旁邊的值相加。

例如,“ a”的值為1,程序應將“ a”與列表中的所有術語進行比較,直到找到匹配項為止。 一旦找到另一個值為7的項“ a”,則應將這兩個值相加,從而得出a = 8。

預期輸出為-

a=8, b=10, c=12, d=14, e=16, f=18

您建議的解決方案的復雜度為O(n 2 )。

您可以使用defaultdict在O(n)中完成此操作(因為它需要對整個列表進行一次傳遞):

from collections import defaultdict

li = [('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5), ('f', 6), ('a', 7), ('b', 8), 
      ('c', 9), ('d', 10), ('e', 11), ('f', 12)]

output = defaultdict(int)

for letter, number in li:
    output[letter] += number

print(output)
# defaultdict(<class 'int'>, {'a': 8, 'b': 10, 'c': 12, 'd': 14, 'e': 16, 'f': 18})

當然,此解決方案要求元素是可哈希的,但是可以通過使用元素的字符串表示法來糾正這些問題。

不使用defaultdict的答案。

_list = [("a",1),("b",2),("c",3),("d",4),("e",5),("f",6),("a",7),("b",8),("c",9),("d",10),("e",11),("f",12)]

tmp = dict()

for k in _list:
    try:
        tmp[k[0]] += k[1]
    except KeyError:
        tmp[k[0]] = k[1]

print(tmp)    

結果:

{'a': 8, 'b': 10, 'c': 12, 'd': 14, 'e': 16, 'f': 18}

使用itertools.groupbyoperator.itemgetter ,可以用lambda代替

from itertools import groupby
from operator import itemgetter

lst = sorted(lst, key=itemgetter(0))
d = {k: sum(i[1] for i in g) for k, g in groupby(lst, key=itemgetter(0))}
# {'a': 8, 'b': 10, 'c': 12, 'd': 14, 'e': 16, 'f': 18}

詞典理解擴展:

d = {}
for k, g in groupby(lst, key=itemgetter(0)):
    d[k] = sum(i[1] for i in g)
from collections import defaultdict

l = [('a',1),('b',2),('c',3),('d',4),('e',5),('f',6),('a',7),('b',8),('c',9),('d',10),('e',11),('f',12)]

d = defaultdict(int)
for k, v in l:
    d[k] += v

結果:

defaultdict(<class 'int'>, {'a': 8, 'b': 10, 'c': 12, 'd': 14, 'e': 16, 'f': 18})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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