2017-05-29 69 views
0

我有以下列表"mylist"爲我創造了"foundkeys"功能來搜索它的另一個列表"keys"項目發生,輸出會像"formatted_list"現在我通過的"foundkeys"輸出到"reorder"函數,其將"order"例子"foundkeys"的內容重新排序成特定格式。與列表VS由函數創建一個列表工作

問題 如果我用上面的設置我沒有得到所需的準確輸出,但如果我通過「‘FORMATTED_LIST’」「這是"foundkeys"確切的輸出」,以"reorder"而不是調用"foundkeys" ,我會得到所需要的格式

正確的輸出應該是這樣的: 用「a」鍵有其開始與「A」並且其以「K」

[['a', [[1, 'a', 'Asfoor', 'b', 'c'], 
     [2, 'a', 'j', 'deek', 'k'], 
     [3, 'a', 'k', 'bata', 'p']]], 
['k', [[2, 'k', 'j', 'a', 'deek'], 
     [3, 'k', 'bata', 'a', 'p'], 
     [4, 'k', 'v', 'm', 'farkha']]]] 
元素「K」關鍵要素

,但如果我使用的設置我得到這個錯誤輸出: 它「A」中的元素把「K」,而不是「一」鍵

[['a', [[1, 'a', 'Asfoor', 'b', 'c'], 
     [2, 'k', 'j', 'deek', 'a'], 
     [3, 'k', 'a', 'bata', 'p']]], 
['k', [[2, 'k', 'j', 'deek', 'a'], 
     [3, 'k', 'a', 'bata', 'p'], 
     [4, 'k', 'v', 'm', 'farkha']]]] 

好心看看到的代碼更好的理解。

mylist= 
    [[1, 'Asfoor', 'a', 'b', 'c'], 
    [2, 'deek', 'j', 'a', 'k'], 
    [3, 'bata', 'k', 'a', 'p'], 
    [4,'farkha','v','m','k']] 

keys = ['a', 'k'] 

def foundkeys(mylist,keys): 
    def found(list, k): 
     return k in list 
    final = [] 
    for j in keys: 
     final.append([j , [k for k in mylist if found(k, j)]]) 

    return final; 
order=foundkeys(mylist,keys) 
print("New list with found keys \n",order)  

formatted_list= 
    [ 
     [ 
      'a', [[1, 'Asfoor', 'a', 'b', 'c'], [2, 'deek', 'j', 'a', 'k'], [3, 'bata', 'k', 'a', 'p'] 
     ]], 
     [ 
      'k', [[2, 'deek', 'j', 'a', 'k'], [3, 'bata', 'k', 'a', 'p'], [4, 'farkha', 'v', 'm', 'k']] 
     ] 
    ] 

def reorder(alist): 

    for item in alist: 
     key=item[0] 
     value=item[1] 
     for c,v_item in enumerate(value): 
      old=value[c][1] 
      for i,s_value in enumerate(value[c]): 
       if s_value==key: 
       value[c][i]=old 
       value[c][1]=key 

# calling reorder function with order function list 
reorder(order) 
print(order) 
# calling reorder function with formatted_list instead 
reorder(formatted_list) 
print(formatted_list) 

回答

1

Python使用引用來存儲列表。要查看此信息,請嘗試運行以下代碼。

a = [1, 2] 
b = [a for i in range(0, 3)] 
print(b) # prints out [[1, 2], [1, 2], [1, 2]] 

b[0][0] = 4 
print(b) # prints out [[4, 2], [4, 2], [4, 2]] 

[a for i in range(0, 3)]不插入三個 「個人」 ab。它實際上插入a的參考b。因此,當我們通過b[0][0]更改元素時,我們使用相同的參考來更改所有列表。

要解決這個問題,只需要python創建一個新列表,而不僅僅是複製引用。

a = [1, 2] 
b = [list(a) for i in range(0, 3)] # This line is different 
print(b) # prints out [[1, 2], [1, 2], [1, 2]] 

b[0][0] = 4 
print(b) # prints out [[4, 2], [1, 2], [1, 2]] 

因此,在你的代碼,它應該是

for j in keys: 
    final.append([j , [list(k) for k in mylist if found(k, j)]]) 

而現在你會得到使用orderformatted_list相同的結果。

你可以看到this post瞭解更多關於參考和副本的理解。

+0

非常感謝你,它現在完美。 –