【问题标题】:How to flatten a dictionary into a tuple of two lists?如何将字典展平为两个列表的元组?
【发布时间】:2016-06-26 00:15:00
【问题描述】:

现在我有一本字典,

{2.9: [0.66], 3.3: [0.82, 0.48]}

我想将它展平为一个由两个列表组成的元组:

([3.3, 3.3, 2.9], [0.82, 0.48, 0.66])

3.3 出现两次,因为对应的字典条目中有两个元素。

我该怎么做?

【问题讨论】:

  • 第二个 3.3 来自哪里?
  • 列表中有两个元素对应3.3,所以每个元素都必须与扁平元组中的3.3匹配。
  • 他正在扩展它。所以想想:{2.9: 0.66, 3.3: 0.82, 3.3:0.48}(如果可能的话)
  • @Goodies,也许他实际上是她;)

标签: python dictionary flatten


【解决方案1】:

如果元组的元组没问题,那就稍微简单一点

>>> D = {2.9: [0.66], 3.3: [0.82, 0.48]}
>>> tuple(zip(*((k, v) for k in D for v in D[k])))
((3.3, 3.3, 2.9), (0.82, 0.48, 0.66))

如果你真的需要列表

>>> tuple(map(list, zip(*((k, v) for k in D for v in D[k]))))
([3.3, 3.3, 2.9], [0.82, 0.48, 0.66])

我对@Steven 和@Padraic 答案的变体。 (我避免使用dict.items,因为它的行为在 Python2 和 Python3 之间非常不同)

keys, vals = result = [], []
for k in D:
    v = D[k]
    vals += v
    keys += [k] * len(v)
print(result)

【讨论】:

    【解决方案2】:
    >>> d = {2.9: [0.66], 3.3: [0.82, 0.48]}
    

    首先让我们将字典的两个键分配到一个元组列表中:

    >>> ts = [(k, x) for k, l in d.items() for x in l]
    >>> ts
    [(3.3, 0.82), (3.3, 0.48), (2.9, 0.66)]
    

    我正在使用两级列表理解,它是等效嵌套循环的语法糖。

    那你可以transpose the list

    >>> result = zip(*ts)
    >>> list(result)
    [(3.3, 3.3, 2.9), (0.82, 0.48, 0.66)]
    

    或者作为单个表达式,使用惰性生成器表达式而不是列表推导:

    result = zip(*((k, x) for k, l in d.items() for x in l))
    

    【讨论】:

    • 次要问题:OP 想要一个列表元组,而不是一个元组列表。
    • 我认为 OP 可能不介意它是元组还是列表 :)
    【解决方案3】:

    史蒂文斯回答的变体使用扩展而不是附加,因为 dict 键是不可变的,所以乘法是安全的。

    d = {2.9: [0.66], 3.3: [0.82, 0.48]}
    
    keys, vals = result = [], []
    for k, v in d.items():
        vals.extend(v)
        keys.extend([k] * len(v))
    

    【讨论】:

      【解决方案4】:

      最好的答案是 John La Rooy 使用 mapzip 和生成器表达式的单行代码。这是一个简单的替代方案:

      d = {2.9: [0.66], 3.3: [0.82, 0.48]}
      
      keys, vals = result = [], []
      for k in d:
          for v in d[k]:
              keys.append(k)
              vals.append(v)
      

      【讨论】:

      • 我比我更喜欢这个——而且它可能也更快
      猜你喜欢
      • 2020-04-01
      • 2020-06-22
      • 1970-01-01
      • 1970-01-01
      • 2016-06-28
      • 1970-01-01
      • 1970-01-01
      • 2013-11-06
      • 2018-10-05
      相关资源
      最近更新 更多