字典值的列表推导式

4

我是新手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循环来遍历值并为每个键创建一个新值。然而,这种方法看起来很慢且笨拙。是否有一种更Pythonic的方法实现这个目标?
谢谢!
5个回答

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

谢谢您的回答!它快速而干净地解决了我的问题。 - macintosh81
很高兴能够帮助! - Ajax1234

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
这将会给你 完全 想要的输出结果:
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列表/生成器转换为列表元组,这正是您想要的。

感谢对zip()函数的解释!现在我对它有了更清晰的理解。 - macintosh81

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

这将生成tuples - Willem Van Onsem
谢谢您的评论!是的,它生成元组列表,但我认为它也适用于OP。 - ettanany
1
非常整洁的解决方案!感谢您的贡献! - macintosh81

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接