如何在Python 3.6中使用f-string创建字典格式?

87

如何使用Python 3.6 F-String格式化字符串?

person = {'name': 'Jenne', 'age': 23}

print('My name {0[name]} and my age {1[age]}'.format(person, person))
print('My name {0} and my age {1}'.format(person['name'], person['age']))
7个回答

140

需要给字典键提供一个引用。

f'我的名字是{person["name"]}, 我的年龄是{person["age"]}'


42
只需在整个字符串和项之间使用不同的引号即可。如果您在双引号中引用字符串,请使用单引号作为键。在Python中,单引号和双引号都具有相同的功能。 - M. Leung
1
谢谢 那个怎么样? print('我的名字是{name},我{age}岁,我的薪水是{salary}。'.format(**person)) - Abou Menah
3
这是 str.format() 方法,f-string 和 str.format 的区别在于如何执行索引查找。在 f-string 中,你必须引用字典中的键,而在 str.format() 中则会自动将索引值转换为字符串。 - M. Leung
在 Python 3.12+ 中,你可以使用相同的引号,例如:f'我的名字是 {person['name']},年龄是 {person['age']}' - Arn

52

根据您的字典对给定字符串所做的贡献数量,您可能会考虑使用.format(**dict) 来使其更加易读,即使它没有f-string的简洁优雅。

>>> person = {'name': 'Jenne', 'age': 23}
>>> print('My name is {name} and my age is {age}.'.format(**person))

输出:

我的名字是Jenne,我今年23岁。

虽然这个选项是情景性的,但你可能会喜欢避免引号和双引号混乱。


3
这个问题明确涉及Python 3.6的f字符串,你需要清晰地解释你的回答,但这不是被问及的内容。 - jpoppe
7
很好,我写这条评论时最近也在我的工作中使用了f字符串,像这样:f'一些文本 {mydict['我愚蠢的错误']} 更多文本'f'一些文本 {mydict["这有效"]} 更多文本'。视觉上很难发现错误(也许是因为我太差了),所以尽管我很喜欢f字符串,但这是旧格式更加灵活且避免我这样的笨蛋再犯错误的一个方面。 - Mark Langford
2
你可以使用 format_map 函数,像这样 print('My name is {name} and my age is {age}.'.format_map(person))。参考链接:https://docs.python.org/3/library/stdtypes.html#str.format_map - dbow
3
@dbow 两者之间的 .format_map(dict).format(**dict) 有什么区别吗? - MichaelChirico

26

以下两个语句从Python 3.6开始都可以使用:

  1. print(f'我的名字是{person["name"]},年龄是{person["age"]}')
  2. print(f"我的名字是{person['name']},年龄是{person['age']}")

请注意上述语句中单引号和双引号的用法,放置不当将导致语法错误。


6

pkuphy 发布的字符串是正确的,你必须使用引号来访问该字典:

f'My name {person["name"]} and my age {person["age"]}'

您的原始字符串适用于str.format()函数:
>>> person = {'name': 'Jenne', 'age': 23}
>>> print('My name is {person[name]} and my age is {person[age]}.'.format(person=person))

输出:

我的名字是Jenne,我23岁。

第一个person引用格式字符串中的所有出现,第二个给出要填充的变量。


4

这将有效。

f'My name {person["name"]} and my age {person["age"]}'

如果nameobj的一个属性,那么f'name is {obj[name]}',但对于像这个问题中的字典,您可以直接访问键f'name is {person["name"]}'

错误,这就是我在问的原因:f'我的名字是{person[name]},我的年龄是{person[age]}' NameError: name 'name'未定义 - Abou Menah
1
你是否按照建议将姓名和年龄括在括号中? - ffi
请注意,这将在Python 3.5或更低版本中无法工作。 F-strings是在Python 3.6中引入的。 - Spartacus

2
你只有一个对象,这并不能帮助理解事物是如何工作的。让我们构建一个更完整的例子。

你只有一个物体,这样并不能很好地理解事情是如何运作的。让我们来举一个更完整的例子。

person0 = {'name': 'Jenne', 'age': 23}
person1 = {'name': 'Jake', 'age': 29}
person2 = {'name': 'John', 'age': 31}
places = ['Naples', 'Marrakech', 'Cape Town']

print('''My name {0[name]} and my age {0[age]},
your name {1[name]} and your age {1[age]},
my favourite place {3[0]}'''.format(person0, person1, person2, places))

你也可以从参数列表中访问完整的对象,例如:

您可以使用以下方式访问完整对象:

print('{2}'.format(person0, person1, person2, places))

或者选择属性,甚至是级联的:

最初的回答

print('{3.__class__.__name__}'.format(person0, person1, person2, places))

0

使用f-string快速将字典转换为字符串,无需手动输入键名

我正在寻找一个简单的解决方案,以便将字典的键值对转换为简单的一对,而无需深入到字典的每个键中。

person = {'name': 'Jenne', 'age': 23}
stringified_dict = ' '.join([f'{k.capitalize()} {v}' for k,v in person.items()])
print(f'In a Variable -->   {stringified_dict}')

# function
def stringify_dict(dict_val:dict) -> str:
    return ' '.join([f'{k.capitalize()} {v}' for k,v in dict_val.items()])

stringified_dict = stringify_dict({'name': 'Jenne', 'age': 23})
print(f'Using Function -->  {stringified_dict}')


# lambda
stringify_dict = lambda dict_val: ' '.join([f'{k.capitalize()} {v}' for k,v in dict_val.items()])
stringified_dict = stringify_dict({'name': 'Jenne', 'age': 23})
print(f'Using Lambda -->    {stringified_dict}')

输出

In a Variable -->   Name Jenne Age 23
Using Function -->  Name Jenne Age 23
Using Lambda -->    Name Jenne Age 23

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