假设以下玩具集(来自CSV文件,其中列名称是"键",我只对我在"数据"中放入的某些行感兴趣):
keys = ['k1', 'k2', 'k3', 'k4']
data = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]]
Run Code Online (Sandbox Code Playgroud)
我想获得一个包含每列列表的字典,如下所示:
{'k1': [1, 5, 9, 13], 'k2': [2, 6, 10, 14], 'k3': [3, 7, 11, 15], 'k4': [4, 8,
12, 16]}
Run Code Online (Sandbox Code Playgroud)
在我的代码中,我首先使用空列表初始化字典,然后迭代(按键的顺序)以附加列表中的每个项目.
my_dict = dict.fromkeys(keys, [])
for row in data:
for i, k in zip(row, keys):
my_dict[k].append(i)
Run Code Online (Sandbox Code Playgroud)
但它不起作用.它构建了这个字典:
{'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]}
Run Code Online (Sandbox Code Playgroud)
您可以看到所有元素都在所有列表中,而不是每个列表中只有四个元素.如果我在循环中打印i,k,它会执行正确的项目和键对.所以我猜问题是当我在密钥k的列表中添加项目i时.
有谁知道为什么所有元素都被添加到所有列表中,以及构建我的字典的正确方法是什么?
提前致谢
压缩它但首先转置它:
>>> 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)}
Run Code Online (Sandbox Code Playgroud)
如果你想要数组中的列表不是元组:
>>> print dict(zip(keys, [list(i) for i in zip(*data)]))
Run Code Online (Sandbox Code Playgroud)
如果你想使用你的版本,只需要字典理解,而不是fromkeys:
my_dict = { k : [] for k in keys }
Run Code Online (Sandbox Code Playgroud)
在您的情况下,您my_dict使用相同的值初始化的问题:
>>> 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]}
Run Code Online (Sandbox Code Playgroud)
当你做对了(使用字典/列表理解):
>>> 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': []}
Run Code Online (Sandbox Code Playgroud)
您正在遇到此答案中解释的问题:您使用为所有值重新生成的相同列表对象初始化字典.简单地使用
dict(zip(keys, zip(*data)))
Run Code Online (Sandbox Code Playgroud)
代替.这会将行列表转换为列列表,然后将键和列压缩在一起.
| 归档时间: |
|
| 查看次数: |
5236 次 |
| 最近记录: |