簡體   English   中英

python3匯總元素列表形式的列表

[英]python3 summarize elements form list of lists

我有一個清單清單

lst = [[0,1],[1,1],[3,1],[1,2],[1,3],[3,5]]

我想將子列表的第二項歸納為相等的第一項。 結果應該看起來像

lst = [[0,1],[1,6],[3,6]]

我嘗試過這樣的事情:

lst=[[0, 0.25], [1, 0.125], [2, 0.0625], [3, 0.0625], [1, 0.125], [2, 0.0625], [3, 0.03125], [4, 0.03125]]
for listitem in range(len(lst)):
    first=listitem[0]
    second = 0
    for obj in lst:
        if obj[0] == first:
            second += obj[1]
            lst.remove(obj)
    listitem[1] = second

使用defaultdict

    from collections import defaultdict

    lst=[[0, 0.25], [1, 0.125], [2, 0.0625], [3, 0.0625], [1, 0.125], [2, 0.0625], [3, 0.03125], [4, 0.03125]]

    res = defaultdict(int)    
    for el in lst:
        res[el[0]] += el[1] 
    res_list = [[k,v] for (k,v) in res.items()]

    print(res_list)

[[0, 0.25], [1, 0.25], [2, 0.125], [3, 0.09375], [4, 0.03125]]

groupby返回一個密鑰,並在具有相同密鑰的項目上進行迭代。 必須將按相同鍵排序的列表傳遞給它:

from itertools import groupby
from operator import itemgetter

lst = [[0,1],[1,1],[3,1],[1,2],[1,3],[3,5]]

result = [[k,sum(b for a,b in g)]
           for k,g in groupby(sorted(lst),key=itemgetter(0))]

print(result)

輸出:

 [[0, 1], [1, 6], [3, 6]]

另一種思考方式是每對中的第一項是key ,第二項是value -因此,如果創建dict ,則可以在遇到每個鍵時將值加在一起-甚至如果使用defaultdict更容易:

from collections import defaultdict

summary = defaultdict(int)
for sublist in lst:
    key, value = sublist
    summary[key] += value

print(summary.items())

summary[key] += value是這里的主力軍。 它能做什么:

  • 在摘要中查找key
  • 如果不存在,則添加它並使用int來創建默認值
  • 返回值(已經存在或剛創建的值)
  • 向其添加新值
  • 將其存儲回key下的summary

range(n)產生一個列表,例如[0,1,2...n-1] ,所以listitem的類型是int而不是list

lst=[[0, 0.25], [1, 0.125], [2, 0.0625], [3, 0.0625], [1, 0.125], [2, 0.0625], [3, 0.03125], [4, 0.03125]]
for listitem in lst:
    first = listitem[0]
    second = 0
    for obj in lst:
        if obj[0] == first:
            second += obj[1]
            lst.remove(obj)
    listitem[1] = second        

暫無
暫無

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

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