使用str.format()和字典

时间:2019-09-10 21:19:09

标签: python dictionary

为什么这样做:

data = {'first': 'Hodor', 'last': 'Hodor!'}
print('{first} {last}'.format(**data))

这有效:

bdays = {
    'Wesley Neill': 'January 6, 1985',
    'Victoria Neill': 'August 25, 1992',
    'Heather Neill': 'June 25, 1964'
}

print('\n {} \n {} \n {}'.format(*bdays))

但这不起作用:

 print('\n {} \n {} \n {}'.format(**bdays))

Traceback (most recent call last):
  File "C:/Users/wesle/PycharmProjects/practicepython/birthdays.py", line 9, in <module>
    print('We have the following names in our dictionary: \n {} \n {} \n {} \n'.format(**bdays))
IndexError: tuple index out of range

第一个示例在占位符大括号中包含字典键,并在参数中使用** kwargs。

第二个没有键,.format()参数中只有一个星号。

第三个参数在占位符中没有键,如示例1所示,但它在参数中确实使用了** kwargs。

我知道需要做些什么才能使工作正常进行,但我对这里的细微之处感到好奇。

2 个答案:

答案 0 :(得分:1)

.format(**bdays)等同于.format(key1=value, key2=value2,...),其中键是名称,值是生日。

要使其正常工作,您的打印对帐单必须变为-

print('\n {Wesley Neill} \n {Victoria Neill} \n {Heather Neill}'.format(**bdays))

这将打印这三个人的生日。

在python控制台中尝试以下操作-

>>> [*bdays]
['Wesley Neill', 'Victoria Neill', 'Heather Neill']

答案 1 :(得分:1)

首先,星号表示法的作用:

**dict is equivalent to k1=v1, k2=v, ...
*dict is equivalent to [k1, k2, ...]

所以您正在做

# This print('{first} {last}'.format(**data)) is:
print('{first} {last}'.format(first='Hodor', last='Hodor!'))

# This print('\n {} \n {} \n {}'.format(*bdays)) is:
print('\n {} \n {} \n {}'.format(['Wesley Neill', 'Victoria Neill', 'Heather Neill']))

# This print('\n {} \n {} \n {}'.format(**bdays)) is:
print('\n {} \n {} \n {}'.format('Wesley Neill'='January 6, 1985', 'Victoria Neill'='August 25, 1992', 'Heather Neill'='June 25, 1964'))

最终格式字符串中没有任何键,因此会出现错误。