Python使用带字典的格式映射

Python使用带字典的格式映射,python,python-3.x,format,Python,Python 3.x,Format,我有一本字典: People={ 'name':['john','peter'], 'age':[56,64] } 输出 'My name is {name[0]},i am {age[0]} old'.format_map(People) 给予 我想在循环中使用format_map来获得: 'My name is {name[x]},i am {age[x]} old' 对于字典中的每个项目,如: 'My name is john,i am 56

我有一本字典:

People={
       'name':['john','peter'],
       'age':[56,64]
       }
输出

'My name is {name[0]},i am {age[0]} old'.format_map(People)
给予

我想在循环中使用format_map来获得:

'My name is {name[x]},i am {age[x]} old'
对于字典中的每个项目,如:

'My name is john,i am 56 old'
'My name is peter,i am 64 old'
但是一个循环是这样的:

['My name is {name[x]},i am {age[x]} old'.format_map(People) for x in range(0,len(People['name']))]
给出:

KeyError: 'name'

str.format\u map
接受映射。不能传递附加参数

或者,您可以使用
str.format
,但不允许在索引(
{0[name][{x}]}
)中嵌套
{..}

使用and/的变通方法:


您可以更直观地执行以下操作:

strs = ["My name is " + People['name'][i] + ",i am " + str(People['age'][i]) + " old" for i in len(People)]
print(strs # ['My name is john,i am 56 old', 'My name is peter,i am 64 old'])

您可以执行两个过程格式化:

people = {
   'name': ['John', 'Peter'],
   'age': [56, 64]
}

for i in range(2):
    'My name is {{name[{0}]}}, I am {{age[{0}]}} years old.'.format(i).format_map(people)

#>>> 'My name is John, I am 56 years old.'
#>>> 'My name is Peter, I am 64 years old.'

<代码> {{{}}}…<代码> >格式>代码>…{…}…<代码>,因此适合第二次调用<代码>格式< /> >

< p>您可能希望考虑为数据使用不同的结构,将每个人的所有数据保持在一起。因为只有两个人,每个人只有两个属性,这并不重要,但是如果你有很多人和很多属性,那么只需要在你的一个列表中出现一个错误就可以破坏同步。如果发生这种情况,数据库中的一个或多个用户将获取与他们相关的错误数据

一种可能是使用一份口述清单,每个人一份口述,例如

new_people = [
    {'age': 56, 'name': 'john'},
    {'age': 64, 'name': 'peter'}
]
然后,您可以通过执行以下操作轻松打印它:

for d in new_people:
    print('My name is {0}, I am {1} years old.'.format(d['name'], d['age']))
输出:

My name is john, I am 56 years old.
My name is peter, I am 64 years old.

把你现有的人的口述转换成口述列表并不难。使用两个
for
循环可能更具可读性,但我使用了这个嵌套的列表理解/生成器表达式:

new_people=[dict(t)for t in((k,v[i])for k,v in people.items())for i in range(len(people['name']))]


在Python中,对普通变量使用小写名称是一种惯例。以大写字母开头的名字,像人一样,通常用于类。您不必遵循这种约定,但它确实使阅读您的代码的人更容易。您可能会注意到,您在上面发布的代码中,人物是浅蓝色的,这是因为SO代码格式化程序认为这是一个类名。

我会使用
len(人物['name'))
而不是像OP那样使用硬编码2。顺便说一句,Python3.x中的print是一个函数。@PM2Ring,它对我来说非常有效(在Python2.7和Python3.4中都是)。请参见:@PM2Ring,
map
version如果字典中有两个以上的键,则更有用。(你不需要重复
人[…]
)@PM2Ring,你完全正确。很抱歉灌输了错误的思想。谢谢你指出这一点。没问题,falsetru.OP使用Python3.x。Python 3.x中没有dict.iteritems。它应该是
items
len(People)
将始终返回2,即使列表中有更多的人,因为给定的字典中有两个键
len(People)
应该是
len(People['name'])
。我会这样做:
new_People=[{k:v[I]代表k,v在People.items()}代表I在范围内(len(People['name'])]
(使用dict理解)@falstru:你的dict理解肯定比我的(in)理解干净得多。我真的应该有一天学习Python3……Python2.7中也提供了字典理解功能。
for d in new_people:
    print('My name is {0}, I am {1} years old.'.format(d['name'], d['age']))
My name is john, I am 56 years old.
My name is peter, I am 64 years old.