[英]Subtraction between two nested lists of strings in Python
我正在嘗試遵循此問題中用於嵌套列表的結構,但是我很困惑,不知道如何解決。 假設減去兩個列表a = ['5', '35.1', 'FFD']
和b = ['8.5', '11.3', 'AMM']
,下面的代碼用於得出等式c = b-a:
diffs = []
for i, j in zip(a, b):
try:
diffs.append(str(float(j) - float(i)))
except ValueError:
diffs.append('-'.join([j, i]))
>>> print(diffs)
['3.5', '-23.8', 'AMM-FFD']
我的問題是,如何通過考慮以下結構來獲得C = B-A:
A = [['X1','X2'],['52.3','119.4'],['45.1','111']]
B = [['Y1','Y2'],['66.9','65'],['99','115.5']]
C = [['Y1-X1','Y2-X2'],['14.6','-54.4'],['53.9','4.5']]
以及我如何每個內部列表的第一和第二個元素,例如:
Array 1 = ['Y1-X1', '14.6', '53.9'] Array 2 = ['Y2-X2', '-54.4', '4.5']
我感謝任何幫助。
好吧,如果可以保證列表始終嵌套2個級別,則只需再添加一個循環即可:
diffs_lists = []
for i, j in zip(a, b):
diffs = []
for k, l in zip(i, j):
try:
diffs.append(str(float(k) - float(l)))
except ValueError:
diffs.append('-'.join([k, l]))
diffs_lists.append(diffs)
按照您的要求將結果分成兩部分,只需使用zip:
zip(*diffs_lists)
您只需要另一個循環級別:
res = []
for a, b in zip(A, B):
diffs = []
res.append(diffs)
for i, j in zip(a, b):
try:
diffs.append(str(float(j) - float(i)))
except ValueError:
diffs.append('-'.join([j, i]))
print(res)
#[['Y1-X1', 'Y2-X2'], ['14.600000000000009', '-54.400000000000006'], ['53.9', '4.5']]
print(list(zip(*res)))
#[('Y1-X1', '14.600000000000009', '53.9'), ('Y2-X2', '-54.400000000000006', '4.5')]
diffs=[]
for sub_b, sub_a in zip(b, a):
curr = []
for atom_b, atom_a in zip(sub_b, sub_a):
try:
curr.append(float(atom_b) - float(atom_a))
except ValueError:
curr.append('-'.join([atom_b, atom_a]))
diffs.append(curr)
ans1, ans2 = zip(*diffs)
zip
功能還可以用於解壓縮可迭代項。
假設您有一個list_diffs
函數,基本上就是您提供的代碼:
list_diffs(a, b):
diffs = []
for i, j in zip(a, b):
try:
diffs.append(str(float(j) - float(i)))
except ValueError:
diffs.append('-'.join([j, i]))
return diffs
然后,所需的C
只是一個列表,其元素是A
元素和B
元素之間的差異。 因此,以下內容為您C
:
C = []
for i in range(len(A)):
C.append(list_diffs(A[i], B[i]))
獲取第一個和第二個元素的列表:
array1 = [c[0] for c in C]
array2 = [c[1] for c in C]
如果您需要使用它來處理任意數量的嵌套,則可以使用遞歸:
def subtract(x, y):
diffs = []
for a, b in zip(x, y):
try:
if isinstance(a, list):
diffs.append(subtract(a, b))
else:
diffs.append(str(float(b) - float(a)))
except ValueError:
diffs.append('-'.join([b, a]))
return diffs
正如其他人指出的那樣,可以使用zip
解壓縮:
res = subtract(A, B)
t1, t2 = zip(*res)
print(t1)
print(t2)
輸出:
('Y1-X1', '14.6', '53.9')
('Y2-X2', '-54.4', '4.5')
我嘗試使用遞歸方法
A = [['X1','X2'],['52.3','119.4'],['45.1','111']]
B = [['Y1','Y2'],['66.9','65'],['99','115.5']]
C = [['Y1-X1','Y2-X2'],['14.6','-54.4'],['53.9','4.5']]
Array_a,Array_b = [[] for __ in range(2)]
def diff(B,A):
_a = 0
for b,a in zip(B,A):
if isinstance(b,list):
diff(b,a)
else:
try:
Array_b.append(float(b)-float(a)) if _a else Array_a.append(float(b)-float(a))
_a = True
except (ValueError,TypeError) as e:
Array_b.append("{0}-{1}".format(b,a)) if _a else Array_a.append("{0}-{1}".format(b,a))
_a = True
return (Array_a,Array_b)
print (diff(B,A))
>>>(['Y1-X1', 14.600000000000009, 53.9], ['Y2-X2', -54.400000000000006, 4.5])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.