我有一個清單A=[a,b,c,d]。我需要B根據A.
B= [a, b-(a), c-(a (b-a)), d-(a (b-a) (c-(a (b-a)))) ]
有沒有一種 Pythonic 的方式來做到這一點?串列 A 并不總是 4 項串列,因此解決方案需要可推廣到任意長度的串列。提前致謝。
uj5u.com熱心網友回復:
您的所有術語都取消了(c-(a (b-a))簡化為c - b,d-(a (b-a) (c-(a (b-a))))簡化為d - c),因此這里真正的演算法是每個術語等于匹配術語減去前一個術語。這大大簡化了事情:
B = [A[0]] # Initial term has no prior to subtract from it
B = [x - y for x, y in zip(A[1:], A)] # All other terms computed by subtracting term n - 1 from term n
如果您想單行此(忽略匯入),您可以粘貼一個虛擬0來獲取第一個元素的結果,而無需顯式特殊情況:
from itertools import chain # At top of file
B = [x - y for x, y in zip(A, chain([0], A))]
如果您喜歡使用map和朋友進行微優化,您可以將后者替換為:
from operator import sub # At top of file
B = [*map(sub, A, chain([0], A))]
并將所有作業推送到 C 層(不執行每個元素的位元組碼)。
uj5u.com熱心網友回復:
請注意,您的串列的運算式可以簡化為:
B = [a, b-a, c-b, d-c]
考慮到這一點,我們可以使用串列推導:
[y - x for x, y in zip([0] data, data)]
例如,
data = [1, 2, 7, 6]
result = [y - x for x, y in zip([0] data, data)]
print(result)
輸出:
[1, 1, 5, -1]
uj5u.com熱心網友回復:
正如評論中的人所建議的那樣,這是最簡單,最快的解決方案:
A = [5, 9, 3, 8]
B = [x - y for x, y in zip(A, [0] A)]
這輸出:
B
[5, 4, -6, 5]
uj5u.com熱心網友回復:
Pythonic方式: -
A = [1,2,3,4]
B = [A[0]] [A[i 1]-A[i] for i in range(len(A)-1)]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/447413.html
