如何将字典拼成两个列表的元组?

时间:2016-03-10 22:24:47

标签: python dictionary flatten

现在我有一本字典,

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

我希望将其展平为由两个列表组成的元组:

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

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

我该怎么做?

4 个答案:

答案 0 :(得分:6)

如果元组的元组没问题,那就更简单了

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

答案 1 :(得分: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))

答案 2 :(得分:2)

Stevens的变体使用extend而不是追加,因为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))

答案 3 :(得分:1)

最好的答案是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)