代码之家  ›  专栏  ›  技术社区  ›  Pavel M.

列表的用户记录

  •  1
  • Pavel M.  · 技术社区  · 9 年前

    我相信我犯了一个我找不到的小错误。基本上,我正在设计一个简单的数据容器来保存{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]}
    

    1 回复  |  直到 9 年前
        1
  •  2
  •   perigon    9 年前

    问题是,您正在将newdict中的所有值分配为相同的空列表。有关相关行为的解释,请参阅此处: Python initializing a list of lists 。该值只计算一次,字典中的所有值存储相同的列表对象。

    顺便说一句 [] * n []

    更改此行:

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

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