【问题标题】:key value pairs from tuple in pythonpython中元组的键值对
【发布时间】:2012-11-22 09:12:19
【问题描述】:

如何将元组动态转换为键值对?

假设我有:

tuple = ('name1','value1','name2','value2','name3','value3')

我想把它放进字典里:

dictionary = { name1 : value1, name2 : value2, name3 : value3 )

【问题讨论】:

  • 如果您的元组中有奇数个项目,您希望发生什么?另外,您不想使用tuple 作为变量名...

标签: python django web.py


【解决方案1】:

将元组转换为键值对并让dict 构造函数构建字典:

it = iter(tuple_)
dictionary = dict(zip(it, it))

zip(it, it) 习惯用法从原本扁平的可迭代对象中产生成对的项目,提供可以传递给 dict 构造函数的成对序列。 itertools 文档中的grouper recipe 对此进行了概括。

如果输入足够大,请将zip 替换为itertools.izip 以避免分配临时列表。与基于将t[i] 映射到[i + 1] 的表达式不同,上述方法适用于任何可迭代对象,而不仅仅是序列。

【讨论】:

  • +1。喜欢这个解决方案。出于某种原因,我一直认为zip() 不会以交替顺序使用它的参数。
  • @JoelCornett zip 并不关心,它只是从左到右消耗迭代。 (从左到右的消费实际上是guaranteed in the documentation,正是为了让这个成语发挥作用。)
  • 顺便说一句,分组习语可以并且经常被表示为单行:dict(zip(*[iter(tuple)] * 2))。单行形式更难理解,所以我没有在这里使用它。
  • zip(*repeat(iter(tuple_), 2) 怎么样?
  • @JoelCornett 它工作得很好,但它需要从itertools 额外导入,所以我看不到[iter(t)] * 2(iter(t),) * 2 的好处。简单的zip(it, it) 似乎仍然是这个想法最清晰的表达,但代价是引入了一个局部变量。 (代价是诱惑过分热心的审阅者将zip(it, it)“优化”成zip(t, t),这实际上破坏了代码!)
【解决方案2】:
dictionary = {tuple[i]: tuple[i + 1] for i in range(0, len(tuple), 2)}

另一种简单的方法:

dictionary = dict(zip(tuple[::2],tuple[1::2]))

【讨论】:

    【解决方案3】:

    只做一个简单的循环。

    my_dic = {}
    tuple = ('name1','value1','name2','value2','name3','value3')
    if len(tuple) % 2 == 1:
        my_dic[tuple[-1]] = None
    for i in range(0, len(tuple) - 1, 2):
        my_dic[tuple[i]] = tuple[i + 1]
    print my_dic
    

    【讨论】:

      【解决方案4】:
      tuple = ('name1','value1','name2','value2','name3','value3')
      d = {}
      for i in range(0, len(tuple), 2):
          d[tuple[i]] = tuple[i+1]
      print d
      

      【讨论】:

        猜你喜欢
        • 2017-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多