Python:将字典列表转换为列表列表

4
我想将字典列表转换为列表列表。
从这个开始。
d = [{'B': 0.65, 'E': 0.55, 'C': 0.31},
     {'A': 0.87, 'D': 0.67, 'E': 0.41},
     {'B': 0.88, 'D': 0.72, 'E': 0.69},
     {'B': 0.84, 'E': 0.78, 'A': 0.64},
     {'A': 0.71, 'B': 0.62, 'D': 0.32}]

To

[['B', 0.65, 'E', 0.55, 'C', 0.31],
 ['A', 0.87, 'D', 0.67, 'E', 0.41],
 ['B', 0.88, 'D', 0.72, 'E', 0.69],
 ['B', 0.84, 'E', 0.78, 'A', 0.64],
 ['A', 0.71, 'B', 0.62, 'D', 0.32]]

我可以从这里获得输出

l=[]
for i in range(len(d)):
    temp=[]
    [temp.extend([k,v]) for k,v in d[i].items()]
    l.append(temp)

我的问题是

  • 有没有更好的方法来做这件事?
  • 我能用列表推导式来实现吗?

Python的哪个版本?顺序重要吗?您还可以使用itertools.chain - [list(chain.from_iterable(x.items())) for x in d] - pault
1
@pault 我的Python版本是3.6.7,顺序很重要。 - ResidentSleeper
3个回答

3

您可以使用列表推导式:

result = [[i for b in c.items() for i in b] for c in d]

输出:

[['B', 0.65, 'E', 0.55, 'C', 0.31], 
 ['A', 0.87, 'D', 0.67, 'E', 0.41], 
 ['B', 0.88, 'D', 0.72, 'E', 0.69], 
 ['B', 0.84, 'E', 0.78, 'A', 0.64], 
 ['A', 0.71, 'B', 0.62, 'D', 0.32]]

2
这似乎是OP所要求的,只是需要注意items()的顺序不是确定性的,并且可能会根据数据和运行而改变。 - jdehesa

3

由于您使用的是Python 3.6.7版本,同时Python 3.6+版本中字典具有插入顺序特性,因此您可以使用itertools.chain来实现所需结果:

from itertools import chain

print([list(chain.from_iterable(x.items())) for x in d])
#[['B', 0.65, 'E', 0.55, 'C', 0.31],
# ['A', 0.87, 'D', 0.67, 'E', 0.41],
# ['B', 0.88, 'D', 0.72, 'E', 0.69],
# ['B', 0.84, 'E', 0.78, 'A', 0.64],
# ['A', 0.71, 'B', 0.62, 'D', 0.32]]

感谢您的回复和留言。所以,如果我使用Python版本<3.7,我必须使用chain来确保它按顺序排列吗? - ResidentSleeper
1
不,低于3.6版本的字典不能保证维护顺序。您必须在旧版本中使用OrderedDict。这里的chain只是用于展平元组,该元组由items返回。 - pault

1
使用lambda表达式可以这样实现:
d = [{'B': 0.65, 'E': 0.55, 'C': 0.31},
     {'A': 0.87, 'D': 0.67, 'E': 0.41},
     {'B': 0.88, 'D': 0.72, 'E': 0.69},
     {'B': 0.84, 'E': 0.78, 'A': 0.64},
     {'A': 0.71, 'B': 0.62, 'D': 0.32}]

d1=list(map(lambda x: [j for i in x.items() for j in i], d))
print(d1)
"""
output

[['B', 0.65, 'E', 0.55, 'C', 0.31],
 ['A', 0.87, 'D', 0.67, 'E', 0.41],
 ['B', 0.88, 'D', 0.72, 'E', 0.69],
 ['B', 0.84, 'E', 0.78, 'A', 0.64],
 ['A', 0.71, 'B', 0.62, 'D', 0.32]]

"""

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接