2017-04-03 11 views
0

次のコードでは、列見出しに基づいて行からそれにマップされたタプルのリスト内の値を出力しようとしています。しかし、マッピングがうまくいかないように見えて、私が望む値を私に与えてくれない。forループ・ラインからタプルのリストへの値のマッピング?

import itertools as it 

def buc(column_headers, tuples): 
    row_dict = {} 
    attribs = [1,2] 
    measure = 10 

    # generate binary table based on number of columns 
    binaries = [i for i in it.product(range(2), repeat=(len(attribs)))] 

    for line in binaries: 
     line = list(line) 

     # replace binary of 1 with 'ALL' or 0 with value from input attribs 
     for index, item in enumerate(line): 
      if (item == 1): 
       line[index] = 'ALL' 
      elif (item == 0): 
       line[index] = attribs[index] 

     line.append(measure) 
     print(line) 

     # map column values to column heading by index and store in row_dict (e.g. {'A': 1, 'B': 'ALL', 'M': 100}) 
     for i in range(len(line)): 
      row_dict[column_headers[i]] = line[i] 
     tuples.append(row_dict) 

    print(tuples) 

次は私が得る電流出力です:

>>> buc(['A', 'B', 'M'], []) 
[1, 2, 10] 
[1, 'ALL', 10] 
['ALL', 2, 10] 
['ALL', 'ALL', 10] 
[{'A': 'ALL', 'B': 'ALL', 'M': 10}, {'A': 'ALL', 'B': 'ALL', 'M': 10}, {'A': 'ALL', 'B': 'ALL', 'M': 10}, {'A': 'ALL', 'B': 'ALL', 'M': 10}] 

私が欲しい正しい出力は、列見出しのインデックスに基づいて行が正しくタプルにマッピングされ、以下、あるべき:

>>> buc(['A', 'B', 'M'], []) 
[1, 2, 10] 
[1, 'ALL', 10] 
['ALL', 2, 10] 
['ALL', 'ALL', 10] 
[{'A': '1', 'B': '2', 'M': 10}, {'A': '1', 'B': 'ALL', 'M': 10}, {'A': 'ALL', 'B': '2', 'M': 10}, {'A': 'ALL', 'B': 'ALL', 'M': 10}] 

どこが間違っていますか?

答えて

2

あなたのリストtuplesには元の辞書への参照のみが含まれているためです。 this answerを参照してください。これはcopyingで修正できます。

tuples.append(row_dict.copy()) 
+0

ああで

tuples.append(row_dict) 

を交換してください!不思議ではない!さて、ありがとう! – iteong

関連する問題