Python: 用整数键解压字典?
Python: Unpacking dictionary with integer keys?
字典如下:
my_dict={'name':'Stack', 'age':11}
print('Name is {name} and age is {age}.'.format(**my_dict))
#output# Name is Stack and age is 11
但是,如果键是字典中的整数,我应该如何解压字典,例如:
new_dict={1:'Stack', 2:'over', 3:'flow'}
print('1 is {1} and 2 is {2} and 3 is {3}'.format(**new_dict))
#output error# tuple index out of range
在这种情况下,如何得到如下结果:
1 is Stack and 2 is over and 3 is flow
我知道可以用许多其他方法来做到这一点,但是否可以在第一个示例中使用相同的策略。谢谢。
可以使用dict.values()
,并且只能使用一个*
:
new_dict={1:'Stack', 2:'over', 3:'flow'}
print('1 is {} and 2 is {} and 3 is {}'.format(*new_dict.values()))
输出:
1 is Stack and 2 is over and 3 is flow
你得到错误的原因是,你知道在 f-strings 中,花括号中的东西是在运行时评估的。
因此,将数字作为键会使 python 认为键是常规整数。
更新:
new_dict={1:'Stack', 2:'over', 3:'flow'}
print(f'3 is {new_dict[3]} and 1 is {new_dict[1]} and 2 is {new_dict[2]}')
输出:
3 is flow and 1 is Stack and 2 is over
my_dict={'name':'Stack', 'age':11, 1:'Stack', 2:'over', 3:'flow'}
for k, v in my_dict.items():
if k == list(my_dict.keys())[-1]:
print(k, 'is', v)
else:
print(k, 'is', v, 'and ', end='')
它输出:
name is Stack and age is 11 and 1 is Stack and 2 is over and 3 is flow
你不能这样拆包。你需要的是别的。
**
在函数调用中将 dict 解压缩为关键字参数,关键字参数名称始终是字符串。 int 1
不是有效的关键字参数名称。即使是,或者如果您将 dict 键转换为字符串,str.format
也不会查找这样的关键字参数。
{1}
、{2}
等在 format
中查找位置参数,而不是关键字参数。没有 **
解包将产生位置参数。此外,由于它们是位置性的,如果您从 1 开始,您需要在位置 0 处有一个虚拟参数,以便其余参数可以位于正确的位置。
如果你真的想用一个字典和一个看起来像那样的格式字符串来做到这一点,最简单的方法可能是通过 string.Formatter
subclass and override get_value
:
import string
class IntDictFormatter(string.Formatter):
def get_value(self, key, args, kwargs):
return kwargs[key]
format_string = '1 is {1} and 2 is {2} and 3 is {3}'
value_dict = {1:'Stack', 2:'over', 3:'flow'}
print(IntDictFormatter().vformat(format_string, (), value_dict))
字典如下:
my_dict={'name':'Stack', 'age':11}
print('Name is {name} and age is {age}.'.format(**my_dict))
#output# Name is Stack and age is 11
但是,如果键是字典中的整数,我应该如何解压字典,例如:
new_dict={1:'Stack', 2:'over', 3:'flow'}
print('1 is {1} and 2 is {2} and 3 is {3}'.format(**new_dict))
#output error# tuple index out of range
在这种情况下,如何得到如下结果:
1 is Stack and 2 is over and 3 is flow
我知道可以用许多其他方法来做到这一点,但是否可以在第一个示例中使用相同的策略。谢谢。
可以使用dict.values()
,并且只能使用一个*
:
new_dict={1:'Stack', 2:'over', 3:'flow'}
print('1 is {} and 2 is {} and 3 is {}'.format(*new_dict.values()))
输出:
1 is Stack and 2 is over and 3 is flow
你得到错误的原因是,你知道在 f-strings 中,花括号中的东西是在运行时评估的。
因此,将数字作为键会使 python 认为键是常规整数。
更新:
new_dict={1:'Stack', 2:'over', 3:'flow'}
print(f'3 is {new_dict[3]} and 1 is {new_dict[1]} and 2 is {new_dict[2]}')
输出:
3 is flow and 1 is Stack and 2 is over
my_dict={'name':'Stack', 'age':11, 1:'Stack', 2:'over', 3:'flow'}
for k, v in my_dict.items():
if k == list(my_dict.keys())[-1]:
print(k, 'is', v)
else:
print(k, 'is', v, 'and ', end='')
它输出:
name is Stack and age is 11 and 1 is Stack and 2 is over and 3 is flow
你不能这样拆包。你需要的是别的。
**
在函数调用中将 dict 解压缩为关键字参数,关键字参数名称始终是字符串。 int 1
不是有效的关键字参数名称。即使是,或者如果您将 dict 键转换为字符串,str.format
也不会查找这样的关键字参数。
{1}
、{2}
等在 format
中查找位置参数,而不是关键字参数。没有 **
解包将产生位置参数。此外,由于它们是位置性的,如果您从 1 开始,您需要在位置 0 处有一个虚拟参数,以便其余参数可以位于正确的位置。
如果你真的想用一个字典和一个看起来像那样的格式字符串来做到这一点,最简单的方法可能是通过 string.Formatter
subclass and override get_value
:
import string
class IntDictFormatter(string.Formatter):
def get_value(self, key, args, kwargs):
return kwargs[key]
format_string = '1 is {1} and 2 is {2} and 3 is {3}'
value_dict = {1:'Stack', 2:'over', 3:'flow'}
print(IntDictFormatter().vformat(format_string, (), value_dict))