示例:
import collections
A = collections.namedtuple('A', 'a b c')
B = collections.namedtuple('B', 'x y z w')
L = [A(a='CODE1', b=B(x=2, y='u', z='v', w='a'), c=10),
A(a='CODE2', b=B(x=4, y='h', z='r', w='b'), c=30)]
我有一组命名元组,想要将其展平,并用b的值替换嵌套的B。
我的尝试:
首先,我尝试将两个命名元组转换为字典并合并它们,但问题是在字典推导式中删除了原始的b值,并且顺序不正确:
t = [{k: v for k, v in {**x.b._asdict(), **x._asdict()}.items()
if k != 'b'} for x in L]
print (t)
[{'x': 2, 'y': 'u', 'z': 'v', 'w': 'a', 'a': 'CODE1', 'c': 10},
{'x': 4, 'y': 'h', 'z': 'r', 'w': 'b', 'a': 'CODE2', 'c': 30}]
还有另一种解决方法,与需要的方法类似,但在我看来有点复杂。我更喜欢列表推导式的解决方案:
t = []
for x in L:
out = {}
d = x._asdict()
for k, v in d.items():
if isinstance(v, tuple):
d1 = v._asdict()
for k1, v1 in d1.items():
out[k1] = v1
else:
out[k] = v
t.append(out)
print (t)
[{'a': 'CODE1', 'x': 2, 'y': 'u', 'z': 'v', 'w': 'a', 'c': 10},
{'a': 'CODE2', 'x': 4, 'y': 'h', 'z': 'r', 'w': 'b', 'c': 30}]
OrderedDict
很好。 - jezrael