在Python中两个嵌套的string列表之间的减法

我试图按照这个问题的嵌套列表中使用的结构,但我很困惑,不知道如何弄清楚。 假设为了减去两个列表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] 

如果你需要这个来处理任意数量的嵌套,你可以使用recursion:

 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') 

我用recursion的方法尝试

 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])