现在我有一本字典,
{2.9: [0.66], 3.3: [0.82, 0.48]}
我希望将其展平为由两个列表组成的元组:
([3.3, 3.3, 2.9], [0.82, 0.48, 0.66])
3.3
出现两次,因为相应的词典条目中有两个元素。
我该怎么做?
答案 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使用map
,zip
和生成器表达式的单线程。这是一个简单的替代方案:
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)