列出词典值的理解

时间:2017-06-29 17:08:37

标签: python list dictionary list-comprehension

我是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方式来实现这一目标?

谢谢!

5 个答案:

答案 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)

我只是想回答一下,因为我还没有看到任何人利用for key, (year, value)。我发现它非常易读和直接

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])} 

a = {k : [list(group) for group in zip(year, val)] for k, (year, val) in d.items()}

enter image description here