【问题标题】:How can I convert a dictionary into a list of tuples?如何将字典转换为元组列表?
【发布时间】:2010-10-15 01:00:55
【问题描述】:

如果我有这样的字典:

{'a': 1, 'b': 2, 'c': 3}

我怎样才能把它转换成这个?

[('a', 1), ('b', 2), ('c', 3)]

我怎样才能把它转换成这个?

[(1, 'a'), (2, 'b'), (3, 'c')]

【问题讨论】:

  • [tuple(reversed(x)) for x in d.items()]
  • @garej:鉴于x 在您的代码中已经是tupleitems 的本质是生成tuples 的可迭代对象),这样会更简单/更快就做[x[::-1] for x in d.items()];反转切片直接构造一个适当大小的反转tuple,而不是让tuple 构造函数从reversed 迭代器迭代填充(在最后进行过度分配和调整大小)tuple
  • @ShadowRanger,你是对的。我只是想明确一点,在这种情况下并不总是需要 k, v 模式。

标签: python list dictionary


【解决方案1】:
>>> d = { 'a': 1, 'b': 2, 'c': 3 }
>>> list(d.items())
[('a', 1), ('c', 3), ('b', 2)]

For Python 3.6 and later,列表的顺序是你所期望的。

在 Python 2 中,您不需要 list

【讨论】:

    【解决方案2】:
    [(k,v) for (k,v) in d.iteritems()]
    

    [(v,k) for (k,v) in d.iteritems()]
    

    【讨论】:

    • "[(k,v) for (k,v) in d.iteritems()]" 相当于 d.items()
    【解决方案3】:

    你想要的是dictitems()iteritems() 方法。 items 返回 (key,value) 元组的列表。由于元组是不可变的,它们不能被反转。因此,您必须迭代项目并创建新元组以获取反转的 (value,key) 元组。对于迭代,iteritems 更可取,因为它使用生成器来生成 (key,value) 元组,而不必将整个列表保存在内存中。

    Python 2.5.1 (r251:54863, Jan 13 2009, 10:26:13) 
    [GCC 4.0.1 (Apple Inc. build 5465)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> a = { 'a': 1, 'b': 2, 'c': 3 }
    >>> a.items()
    [('a', 1), ('c', 3), ('b', 2)]
    >>> [(v,k) for (k,v) in a.iteritems()]
    [(1, 'a'), (3, 'c'), (2, 'b')]
    >>> 
    

    【讨论】:

      【解决方案4】:

      您可以使用列表推导。

      [(k,v) for k,v in a.iteritems()] 
      

      会给你[ ('a', 1), ('b', 2), ('c', 3) ]

      [(v,k) for k,v in a.iteritems()] 
      

      另一个例子。

      Read more about list comprehensions 如果你愿意,你可以用它们做什么非常有趣。

      【讨论】:

        【解决方案5】:
        >>> a={ 'a': 1, 'b': 2, 'c': 3 } >>> [(x,a[x]) for x in a.keys() ] [('a', 1), ('c', 3), ('b', 2)] >>> [(a[x],x) for x in a.keys() ] [(1, 'a'), (3, 'c'), (2, 'b')]

        【讨论】:

          【解决方案6】:

          由于没有其他人这样做,我将添加 py3k 版本:

          >>> d = { 'a': 1, 'b': 2, 'c': 3 }
          >>> list(d.items())
          [('a', 1), ('c', 3), ('b', 2)]
          >>> [(v, k) for k, v in d.items()]
          [(1, 'a'), (3, 'c'), (2, 'b')]
          

          【讨论】:

            【解决方案7】:

            创建命名元组列表

            使用 namedtuple 通常非常方便。例如,您有一个字典,'name' 作为键,'score' 作为值:

            d = {'John':5, 'Alex':10, 'Richard': 7}
            

            您可以将项目列为元组,根据需要进行排序,并获取名称和分数,假设得分最高 (index=0) 的玩家非常Python 像这样:

            >>> player = best[0]
            
            >>> player.name
                    'Alex'
            >>> player.score
                     10
            

            如何做到这一点:

            随机排列或保持collections.OrderedDict的顺序排列:

            import collections
            Player = collections.namedtuple('Player', 'name score')
            players = list(Player(*item) for item in d.items())
            

            按顺序,按值排序('score'):

            import collections
            Player = collections.namedtuple('Player', 'score name')
            

            按最低分优先排序:

            worst = sorted(Player(v,k) for (k,v) in d.items())
            

            以最高分优先排序:

            best = sorted([Player(v,k) for (k,v) in d.items()], reverse=True)
            

            【讨论】:

              【解决方案8】:

              通过字典的keys()values()方法和zip

              zip 将返回一个元组列表,其作用类似于有序字典。

              演示:

              >>> d = { 'a': 1, 'b': 2, 'c': 3 }
              >>> zip(d.keys(), d.values())
              [('a', 1), ('c', 3), ('b', 2)]
              >>> zip(d.values(), d.keys())
              [(1, 'a'), (3, 'c'), (2, 'b')]
              

              【讨论】:

              • 这对我来说是collections.OrderedDict() 的替代品,它更适用于多个版本的 Python HTTP 请求库。尽管我不喜欢 zip 函数名称有点模糊/重载。
              • 请注意,zip-ification 不是“深度”强制转换,即如果有嵌套的子级,它们不会受到影响。您可能必须滚动自己的递归。
              【解决方案9】:
              d = {'John':5, 'Alex':10, 'Richard': 7}
              list = []
              for i in d:
                 k = (i,d[i])
                 list.append(k)
              
              print list
              

              【讨论】:

              • 虽然这段代码可能有助于解决问题,但它并没有解释为什么和/或如何回答问题。提供这种额外的背景将显着提高其长期教育价值。请edit您的答案添加解释,包括适用的限制和假设。
              【解决方案10】:

              这些是 Python 3.x 和 Python 2.x 的重大变化

              对于 Python3.x 使用

              dictlist = []
              for key, value in dict.items():
                  temp = [key,value]
                  dictlist.append(temp)
              

              对于 Python 2.7 使用

              dictlist = []
              for key, value in dict.iteritems():
                  temp = [key,value]
                  dictlist.append(temp)
              

              【讨论】:

                【解决方案11】:

                另一种选择是

                list(dictionary.items())  # list of (key, value) tuples
                list(zip(dictionary.values(), dictionary.keys()))  # list of (value, key) tuples
                

                【讨论】:

                  【解决方案12】:

                  Python3 dict.values() 不返回列表。这是例子

                  mydict = {
                    "a": {"a1": 1, "a2": 2},
                    "b": {"b1": 11, "b2": 22}
                  }
                  
                  print(mydict.values())
                  > output: dict_values([{'a1': 1, 'a2': 2}, {'b1': 11, 'b2': 22}])
                  
                  print(type(mydict.values()))
                  > output: <class 'dict_values'>
                  
                  print(list(mydict.values()))
                  > output: [{'a1': 1, 'a2': 2}, {'b1': 11, 'b2': 22}]
                  
                  print(type(list(mydict.values())))
                  > output: <class 'list'>
                  

                  【讨论】:

                    【解决方案13】:
                    x = {'a': 1, 'b': 2, 'c': 4, 'd':3}   
                    sorted(map(lambda x : (x[1],x[0]),x.items()),key=lambda x : x[0])
                    

                    让我们把上面的代码分解成几个步骤

                    step1 = map(lambda x : (x[1],x[0]),x.items())
                    

                    x[1]:值
                    x[0]:键

                    Step1 将创建一个包含 (value,key) 形式的对的元组列表,例如(4,'c')

                    step2 = sorted(step1,key=lambda x : x[0]) 
                    

                    Step2 从 Step 1 中获取输入并使用元组的第一个值进行排序

                    【讨论】:

                      猜你喜欢
                      • 2019-04-17
                      • 1970-01-01
                      • 1970-01-01
                      • 2013-04-01
                      • 1970-01-01
                      • 2010-09-20
                      • 2017-06-07
                      相关资源
                      最近更新 更多