【问题标题】:Converting simple tuple into dictionary将简单元组转换为字典
【发布时间】:2014-10-20 12:33:51
【问题描述】:

我有一个偶数长度的元组,其中包含 ('a','b','c','d','e','f') 之类的元素,我想将其转换为具有 ['a':'b', 'c':'d', 'e':'f'] 之类元素的字典。

我尝试使用dict(tuple),但这并没有帮助。我刚刚开始学习 Python,任何帮助都将非常感激。

【问题讨论】:

    标签: python dictionary tuples


    【解决方案1】:

    看起来您正在尝试将元组分组为对,然后从这些对中制作一个 dict。有两种方法可以做到这一点。


    首先是压缩切片:

    zip(t[::2], t[1::2])
    

    这称为“扩展切片”,其格式为start:stop:step。第一个是::2,所以它有默认的开始(元组的开始)和停止(元组的结束),步长为2,所以它得到元素0、2和4。第二个一个是1::2,所以是一样的,只不过是从1开始,而不是默认的,所以得到元素1、3、5。

    有关详细信息,请参阅Lists 上的教程部分。 (当然,您使用的是元组,而不是列表,但它们的切片方式相同。)


    第二个是用自身压缩一个迭代器:

    i = iter(t)
    zip(i, i)
    

    由于对i 的两个引用都是同一个迭代器,所以无论何时推进一个,它都会推进两个。所以,第一个得到#0,然后第二个得到#1,然后第一个得到#2,第二个得到#3,依此类推。

    有关详细信息,请参阅 Iterators 上的教程部分。另请参阅How grouper works,它解释了这个想法的更一般版本(或至少尝试这样做)。


    无论哪种方式,你都会得到('a', 'b'),然后是('c', 'd'),然后是('e', 'f'),所以你可以将它传递给dict

    dict(zip(t[::2], t[1::2]))
    

    那么,哪个更好?

    切片可能更容易理解。它通常也更快。

    但是,切片不适用于任意可迭代对象,仅适用于序列,它会在大输入上浪费内存(您实际上是在制作序列的完整额外副本),而且泛化有点困难。

    您应该了解它们的工作原理,以便做出适当的选择。

    【讨论】:

      【解决方案2】:
      def tup2dict():
          tup = ('a','b','c','d','e','f')
          print ({i:j for (i,j) in zip(tup,tup[1:])[::2]})
      

      感谢iterating-over-every-two-elements-in-a-listpython-dictionary-comprehensionn

      【讨论】:

      • 这里的dict理解只是多余的冗长;如果您已经有一个 2 元素可迭代对象的可迭代对象,则只需调用 dict 即可。
      【解决方案3】:
      >>> tup = ('a','b','c','d','e','f')
      >>> dct = dict(zip(tup[::2], tup[1::2]))
      {'a': 'b', 'c': 'd', 'e', 'f'}
      

      这应该可以解决问题

      【讨论】:

        【解决方案4】:

        试试这个:

        t = ('a','b','c','d','e','f')
        dict(t[i:i+2] for i in xrange(0, len(t), 2))
        => {'a': 'b', 'c': 'd', 'e': 'f'}
        

        【讨论】:

          【解决方案5】:

          你可以使用dict理解

          t = ('a','b','c','d','e','f')
          d = {t[i]:t[i+1] for i in range(0,len(t),2)}
          

          注意部分

          range(0,len(t),2)
          

          将生成表单列表

          [0, 2, 4]
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-04-03
            • 2013-04-01
            • 1970-01-01
            • 1970-01-01
            • 2010-09-20
            • 2014-11-28
            相关资源
            最近更新 更多