我是Python新手,我正在努力学习操作字典。我有一个具有以下结构的词典:
dict = {'city1':([1990, 1991, 1992, 1993],[1.5,1.6,1.7,1.8]),
'city2':([1993, 1995, 1997, 1999],[2.5,3.6,4.7,5.8])
我想按以下方式转换密钥
'city': ([1990, 1.5],[1991, 1.6],[1992,1.7],[1993,1.8])
我尝试使用for循环遍历值并为每个键创建一个新值。然而,这看起来非常缓慢而且笨拙。是否有任何Pathonic方式来实现这一目标?
谢谢!
答案 0 :(得分:3)
你可以试试这个:
d = {'city1':([1990, 1991, 1992, 1993],[1.5,1.6,1.7,1.8]),
'city2':([1993, 1995, 1997, 1999],[2.5,3.6,4.7,5.8])}
new_dict = {a:tuple(map(list, zip(b[0], b[1]))) for a, b in d.items()}
输出:
{'city2': ([1993, 2.5], [1995, 3.6], [1997, 4.7], [1999, 5.8]), 'city1': ([1990, 1.5], [1991, 1.6], [1992, 1.7], [1993, 1.8])}
答案 1 :(得分:3)
您可以尝试以下代码
a = [[a, b] for a, b in zip(dict['city1'][0], dict['city1'][1])]
输出
[[1990, 1.5], [1991, 1.6], [1992, 1.7], [1993, 1.8]]
答案 2 :(得分:2)
这为您提供了完全您想要的输出:
d = { k : tuple(map(list, zip(*d[k]))) for k in d }
输出:
{'city2': ([1993, 2.5], [1995, 3.6], [1997, 4.7], [1999, 5.8]), 'city1': ([1990, 1.5], [1991, 1.6], [1992, 1.7], [1993, 1.8])}
另外,请考虑使用与dict
不同的名称,因为这是内置dict
类的名称。
zip(*d[k])
是zip(d[k][0], d[k][1])
的简化版本,但它们都做同样的事情并生成成对元组。
map(list, ...)
生成一个map对象,将zip
中的每个元素转换为一个列表(在python2元组中自动转换为列表)
tuple(...)
将map
列表/生成器转换为列表元组,这正是您想要的。
答案 3 :(得分:1)
一种方法是使用这种简洁的解决方案:
res = {k: zip(v[0], v[1]) for k, v in d.items()}
<强>输出:强>
>>> {k: zip(v[0], v[1]) for k, v in d.items()}
{'city2': [(1993, 2.5), (1995, 3.6), (1997, 4.7), (1999, 5.8)], 'city1': [(1990, 1.5), (1991, 1.6), (1992, 1.7), (1993, 1.8)]}
答案 4 :(得分:1)