2017-05-29 10 views
0

は、私は私が別のリスト"keys"項目の発生のためにそれを検索する"foundkeys"機能を作成したリスト"mylist"以下、出力は今、私は"foundkeys"の出力を渡す"formatted_list"次のようになりますしています〜"reorder""order"の例を"foundkeys"のように特定の形式に並べ替える機能。機能によって作成されたリスト対リストで作業

問題 私は上記の設定を使用する場合、私は必要な正確な出力を得ることはありませんが、私は合格した場合「『formatted_list』」「"foundkeys"の正確な出力である」、"reorder"に代わりの"foundkeys"を呼び出します「」キーは「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', [[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']]]] 

は親切のためのコードに見ての要素の中の「K」を置きますより良い理解。

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

リストを格納するために参照を使用します。これを確認するには、次のコードを実行してみてください。

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)]bに3 "個人" aを挿入しません。実際には、にaの参照を挿入します。したがって、要素を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

ありがとう、それは今、完璧に動作します。 –

関連する問題