2016-11-15 13 views
1

我想在嵌套列表的this問題中遵循使用的結構,但我很困惑,不知道如何弄清楚。假設減去兩個列表a = ['5', '35.1', 'FFD']b = ['8.5', '11.3', 'AMM'],下面的代碼被用於伸手公式C = B - 一個:Python中兩個嵌套的字符串列表之間的減法

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 = [[ 'X1', 'X2'],[ '52.3', '119.4'],[ '45.1', '111']]

B = [[」 Y1','Y2'],['66','65'],['99','115.5']]

C = [['' ],[ '14.6', ' - 54.4'],[ '53.9', '4.5']

和我怎麼每個內部列表的第一個和第二個元素,是這樣的:

Array 1 = ['Y1-X1', '14.6', '53.9'] 
Array 2 = ['Y2-X2', '-54.4', '4.5'] 

我很感激任何幫助。

+0

你試過嵌套您目前在另一個內部的循環? – Priyank

+0

@Braian請在'A = [['X1','X2'] ['52.3','119.4'],['45.1','111']]'處添加缺少的逗號',''。 –

回答

1

好吧,如果它保證該名單將永遠是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(*diffs_lists) 
1

你只需要循環的另一個層面:

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')] 
1
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函數也可用於解壓縮可迭代項。

1

假設你有一個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元素之間的diff列表。所以下面給你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] 
0

如果你需要這個拼圖功能,你可以使用遞歸的任意數量的工作:

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

我嘗試用遞歸方法

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]) 
相關問題