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()
    替换为
    itervalues()
    。在Python3中,仅使用
    values()
  • dict没有任何指定的顺序,因此您不能期望这里的输出是
    P1 L1,P2
    L2

我希望这就是您想要的。

我认为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,