Add items to a dictionary of lists
假设下面的toyset(来自一个csv文件,其中列名是"keys",我只对放入"data"中的一些行感兴趣):
1 2 | keys = ['k1', 'k2', 'k3', 'k4'] data = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]] |
我想得到一本字典,每列都有一个列表,如下所示:
1 2 | {'k1': [1, 5, 9, 13], 'k2': [2, 6, 10, 14], 'k3': [3, 7, 11, 15], 'k4': [4, 8, 12, 16]} |
号
在我的代码中,我首先用空列表初始化字典,然后迭代(按照键的顺序)将每个项附加到它们的列表中。
1 2 3 4 | my_dict = dict.fromkeys(keys, []) for row in data: for i, k in zip(row, keys): my_dict[k].append(i) |
但它不起作用。它建立了这本词典:
1 2 3 4 | {'k3': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], 'k2': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], 'k1': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], 'k4': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]} |
。
您可以看到所有元素都在所有列表中,而不是每个列表中只有四个元素。如果我在循环中打印i,k,它会正确地对项目和键进行打印。所以我想问题是,当我在K键列表中添加项目i时。
有人知道为什么所有的元素都被添加到所有的列表中,以及什么是构建字典的正确方法吗?
提前谢谢
压缩它,但先转换它:
1 2 3 4 | >>> keys = ['k1', 'k2', 'k3', 'k4'] >>> data = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]] >>> print dict(zip(keys, zip(*data))) {'k3': (3, 7, 11, 15), 'k2': (2, 6, 10, 14), 'k1': (1, 5, 9, 13), 'k4': (4, 8, 12, 16)} |
。
如果要列表而不是数组中的元组:
1 | >>> print dict(zip(keys, [list(i) for i in zip(*data)])) |
。
如果你想使用你的版本,只需让字典理解,而不是让
1 | my_dict = { k : [] for k in keys } |
在您的情况下,使用相同的值初始化
1 2 3 4 5 6 | >>> my_dict = dict.fromkeys(keys, []) >>> my_dict {'k3': [], 'k2': [], 'k1': [], 'k4': []} >>> my_dict['k3'].append(1) >>> my_dict {'k3': [1], 'k2': [1], 'k1': [1], 'k4': [1]} |
。
如果你做的对(有字典/列表理解力):
1 2 3 4 5 6 | >>> my_dict = dict((k, []) for k in keys ) >>> my_dict {'k3': [], 'k2': [], 'k1': [], 'k4': []} >>> my_dict['k3'].append(1) >>> my_dict {'k3': [1], 'k2': [], 'k1': [], 'k4': []} |
您遇到了这个答案中解释的问题:您的字典是用为所有值恢复的相同列表对象初始化的。简单使用
1 | dict(zip(keys, zip(*data))) |
号
相反。这将把行列表转换成列列表,然后将键和列压缩在一起。
我认为江户一号〔0〕应该有办法。
首先,我转置您的数据(
另一种解决方案是使用
1 2 3 4 | d=collections.defaultdict(list) tdata=zip(*data) #transpose your data for k,v in zip(keys,tdata): d[k].extend(v) |
当然,这会给你留下一个默认的dict,而不是一个常规的dict,尽管它可以简单地改为常规的dict:
1 2 3 4 | >>> keys = ['k1', 'k2', 'k3', 'k4'] >>> data = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]] >>> dict(zip(keys, zip(*data))) {'k3': (3, 7, 11, 15), 'k2': (2, 6, 10, 14), 'k1': (1, 5, 9, 13), 'k4': (4, 8, 12, 16)} |
。
如果您真的需要列表:
1 2 | >>> dict(zip(keys, map(list, zip(*data)))) {'k3': [3, 7, 11, 15], 'k2': [2, 6, 10, 14], 'k1': [1, 5, 9, 13], 'k4': [4, 8, 12, 16]} |
如果您使用的是python 2,那么
这应该有效:
1 2 3 4 5 6 7 8 | keys = ['k1', 'k2', 'k3', 'k4'] data = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]] mydict = {} for k in keys: b[k] = [] for l in data: b[k].append(l[i]) i += 1 |
注意index()是一个昂贵的函数。当你有一个巨大的数据集时不要使用它。在这种情况下增加一个变量。
edit:no it does no t!对不起,请稍等
编辑:现在开始工作了!