2017-07-18 13 views
1

私は私が見つけることができない小さな誤解をしたと信じています。基本的には、{key1:[values1]、key2:[values2]}を保持する単純なデータコンテナを設計しています。リストのユーザー辞書

class Cells(object): 
    def __init__(self, **kwargs): 
     self.data = {} 

    def __data_len__(self): 
     """ Length of data[first key] list. """ 
     _ = 0 
     for key in self.data.keys(): 
      if self.data[key]: 
       _ = len(self.data[key]) 
       break 
     return _ 

    def subtract_lists(self, x, y): 
     return [item for item in x if item not in y] 

    def add(self, to_add): 
     """ Add columns if not exist """ 
     if not set(to_add.keys()).issubset(self.data.keys()):  # New key means adding 
      new_keys = self.subtract_lists(to_add.keys(), \ 
              self.data.keys())  # it to our dict 
      newdict = dict.fromkeys(new_keys, \ 
            [] * self.__data_len__()) 
      self.data.update(newdict) 

     [self.data[key].append(to_add.get(key, '')) for key in self.data.keys()] 
     print('* Updated data is: %s' % self.data) 

############################## 
# Now, tests...    # 
############################## 
if __name__ == '__main__': 
    cells = Cells() 
    cells.add({'one':1, 'two':2, 'three': 3}) 

所望の出力は次のようであることである。

Updated data is: {'one': [1], 'two': [2], 'three': [3]} 

それは出力:

Updated data is: {'one': [1, 2, 3], 'two': [1, 2, 3], 'three': [1, 2, 3]} 

すなわち、イライラさせられるすべてのキーにすべての値を加算します。どこかのタイプミス?

答えて

2

問題は、newdictのすべての値を同じ空のリストに割り当てることです。関連する動作の説明については、ここをクリックしてください:Python initializing a list of lists値は1回だけ評価され、辞書内のすべての値は同じリストオブジェクトを格納します。

ちなみに、[] * n(任意のn)は、まだまだ[]です。

変更この行:これまで

newdict = dict.fromkeys(new_keys, \ 
           [] * self.__data_len__()) 

newdict = {key: [] for key in new_keys} 
+0

ブリリアント。どうもありがとうございました! – pmus