Python 将嵌套字典值转换为单个字符串
如何将下面的嵌套字典值转换为单个字符串Python 将嵌套字典值转换为单个字符串,python,dictionary,Python,Dictionary,如何将下面的嵌套字典值转换为单个字符串 data = {'people': {'first': {'fname': 'P1', 'lname': 'L1'}, 'second': { 'fname': 'P2', 'lname': 'L2'}}} 输出应为P1 L1,P2 L2 这是我目前的代码: print ', '.join("%s %s" % (data['people'][person].get('fname'), data['people'][person].get('lname')
data = {'people': {'first': {'fname': 'P1', 'lname': 'L1'}, 'second': { 'fname': 'P2', 'lname': 'L2'}}}
输出应为P1 L1,P2 L2
这是我目前的代码:
print ', '.join("%s %s" % (data['people'][person].get('fname'), data['people'][person].get('lname')) for person in data['people'])
这是一个有效的方法,为一个更大的项目集在人民口述?如果没有,如何改进这一点?您的数据结构是递归的,因此需要一个递归函数来获取它们
data = {'people': {'first': {'fname': 'P1', 'lname': 'L1'}, 'second': { 'fname': 'P2', 'lname': 'L2'}}}
def myprint(d):
for k, v in d.iteritems():
if isinstance(v, dict):
myprint(v)
else:
print "{0} : {1}".format(k, v)
myprint(data)
def get_values(data):
values = []
for k, v in data.items():
if isinstance(v, dict):
values.extend(get_values(v))
else:
values.append(v)
return values
或
通过仅在值上循环并在中使用命名字段,可以使表达式稍微简短(重点是使其更可读): 在Python 3.2+中,这也可以通过以下方式完成:
如果dicts中可能缺少键
fname
或lname
,则可以执行以下操作:
def get_values(dct, keys):
return (dct.get(k) for k in keys)
...
>>> keys = ('fname', 'lname')
>>> print ', '.join("{} {}".format(*get_values(p, keys)) for p in data['people'].values())
P2 L2, P1 L1
- 如果值的数量很大,则将
替换为values()
。在Python3中,仅使用itervalues()
values()
- dict没有任何指定的顺序,因此您不能期望这里的输出是
L2P1 L1,P2
我希望这就是您想要的。我认为OP只需要嵌套dict的值。但是,他可以调整您的解决方案,以获得他需要的答案。我的输出如下P1 L1,P2 L2。不需要单独打印。不是通用解决方案。@helloV如果OP的当前代码对他们有效,那么它不明白我们为什么需要通用解决方案。添加排序,
print','.join(“{fname}{lname}.format(**p)表示排序中的p(数据['people'].values())
将给出P1 L1,P2 L2
@Skycc没有定义良好的排序规则,排序dicts这是不好的,不幸的是它在Python 2中工作。谢天谢地,Python 3修复了它。OP总是可以显式地根据值对dict进行排序,但我不建议使用sorted(data['people'].values())
@Ashwini Chaudhary,我知道了,不过我尝试过使用python 2.:)
result = list()
for person in data["people"]:
result.append(data["people"][person]["fname"])
result.append(data["people"][person]["lname"])
result.append(", ")
result.pop()
print(' '.join(result))
>>> print ', '.join("{fname} {lname}".format(**p) for p in data['people'].values())
P2 L2, P1 L1
>>> print (', '.join("{fname} {lname}".format_map(p) for p in data['people'].values()))
P1 L1, P2 L2
def get_values(dct, keys):
return (dct.get(k) for k in keys)
...
>>> keys = ('fname', 'lname')
>>> print ', '.join("{} {}".format(*get_values(p, keys)) for p in data['people'].values())
P2 L2, P1 L1
one = data['people']['second'].values()
two = data['people']['first'].values()
three = one + two
three.reverse()
for each in three:
print each,