我有一個關于在串列中添加值的問題 (python),如果它們在第一個串列中共享相同的鍵。例如,我們有:
lst1 = [A, A, B, A, C, D]
lst2 = [1, 2, 3, 4, 5, 6]
我想知道的是,如果 lst1 中的字串正常,我如何在 lst2 中添加數字。因此,最終結果將是:
new_lst1 = [A, B, A, C, D]
new_lst2 = [3, 3, 4, 5, 6]
在哪里
new_lst2[0] = 1 2
因此,只有在彼此相鄰時才會添加值。
為了讓它更復雜,如果我們有這個例子也應該是可能的:
lst3 = [A, A, A, B, B, A, A]
lst4 = [1, 2, 3, 4, 5, 6, 7]
結果必須是:
new_lst3 = [A, B, A]
new_lst4 = [6, 9, 13]
其中
new_lst4[0] = 1 2 3, new_lst4[1] = 4 5, 和new_lst4[2] = 6 7。
先感謝您!
一些背景知識:我撰寫了一個代碼,用于在荷蘭在線地下模型中搜索并回傳特定輸入位置的地下資料。
資料由層組成:
Layer1,名稱:“BXz1”,top_layer,bottom_layer,傳遞性
Layer2,名稱:“BXz2”,top_layer,bottom_layer,傳遞性
Layer3,名稱:“KRz1”,top_layer,bottom_layer,傳遞性
等等..
BXz1 和 BXz2 是相同的主層,但不同的子層。在傳遞性方面,如果它們彼此相鄰,我想將它們組合起來。所以這樣我會得到:
Layer1 2,名稱:BX,top_layer1,bottom_layer2,組合傳遞性 Layer3,名稱:“KRz1”,top_layer,bottom_layer,傳遞性
uj5u.com熱心網友回復:
如果您不被允許使用庫,您可以使用 zip() 通過一個簡單的回圈來配對鍵和值。
lst3 = ["A", "A", "A", "B", "B", "A", "A"]
lst4 = [1, 2, 3, 4, 5, 6, 7]
new_lst3,new_lst4 = lst3[:1],[0] # initialize with first key
for k,n in zip(lst3,lst4): # pair up keys and numbers
if new_lst3[-1] != k: # add new items if key changed
new_lst3.append(k)
new_lst4.append(0)
new_lst4[-1] = n # tally for current key
print(new_lst3) # ['A', 'B', 'A']
print(new_lst4) # [6, 9, 13]
如果您對庫沒問題,那么 itertools 中的 groupby 結合鍵上的迭代器將使您能夠更簡潔地表達它:
from itertools import groupby
tally = ((k,sum(n)) for i3 in [iter(lst3)]
for k,n in groupby(lst4,lambda _:next(i3)))
new_lst3,new_lst4 = map(list,zip(*tally))
uj5u.com熱心網友回復:
該itertools.groupby標準庫函式提供你所需要的基本功能。然后就是給它正確的鍵并計算每組中的計數。
這是我的實作:
from itertools import groupby
def tally_by_group(keys, counts):
groups = groupby(zip(keys, counts), key=lambda x: x[0])
tallies = [
(key, sum(count for _, count in group))
for key, group in groups
]
return tuple(list(l) for l in zip(*tallies))
代碼說明:
- 我首先
zip()從兩個串列中創建 (key, count) 元組, - 該
groupby基團通過它們每個元組的第一個元素,即,由鍵, - 然后我構造一個 (key, sum(count)) 的串列到
tallies, - 最后將其解壓為兩個結果串列。
用你的例子測驗:
lst1 = ["A", "A", "B", "A", "C", "D"]
lst2 = [1, 2, 3, 4, 5, 6]
l1m, l2m = tally_by_group(lst1, lst2)
print(l1m)
print(l2m)
輸出:
['A', 'B', 'A', 'C', 'D']
[3, 3, 4, 5, 6]
和
lst3 = ["A", "A", "A", "B", "B", "A", "A"]
lst4 = [1, 2, 3, 4, 5, 6, 7]
l3m, l4m = tally_by_group(lst3, lst4)
print(l3m)
print(l4m)
輸出:
['A', 'B', 'A']
[6, 9, 13]
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/369981.html
下一篇:ifelse,is.na并替換
