【问题标题】:List comprehensions of dictionary values列出字典值的理解
【发布时间】:2017-12-03 12:20:35
【问题描述】:

我是 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 方法可以实现这个目标吗?

谢谢!

【问题讨论】:

    标签: python list dictionary list-comprehension


    【解决方案1】:

    你可以试试下面的代码

    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 = {'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])}
      

      【讨论】:

      • 感谢您的回答!它快速而整洁地解决了我的问题。
      • 很高兴能帮上忙!
      【解决方案3】:

      这会给你完全你想要的输出:

      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, ...) 生成一个映射对象,将zip 中的每个元素转换为列表(在python2 中,元组会自动转换为列表)

      tuple(...)map 列表/生成器转换为列表元组,这正是您想要的。

      【讨论】:

      • 感谢 zip() 的解释!现在对我来说更有意义了。
      【解决方案4】:

      我只是将我的答案扔进去,因为我还没有看到有人利用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()}
      

      【讨论】:

        【解决方案5】:

        一种方法是使用这个简洁的解决方案:

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

        【讨论】:

        • 这将生成 元组
        • 感谢您的评论!是的,它会生成元组列表,但我认为它也应该适用于 OP。
        • 非常简洁的解决方案!感谢您的意见!
        猜你喜欢
        • 2016-08-01
        • 1970-01-01
        • 2021-05-09
        • 1970-01-01
        • 1970-01-01
        • 2021-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多