无法以字符串格式方法更新 defaultdict
cant update defaultdict in string format method
我正在尝试为每个用户名生成随机颜色。
我写这个代码的时候name1和name2的颜色是一样的。这里有什么问题?
import random
from collections import defaultdict
def get_color():
print('call')
return ''.join([random.choice('0123456789ABCDEF') for j in range(6)])
colors = defaultdict(get_color)
msg1 = {'name' : 'name1'}
msg2 = {'name' : 'name2'}
for msg in [msg1, msg2]:
msg = '{colors[name]} {name}'.format(colors=colors, **msg)
print(msg)
输出:
call
72C44D name1
72C44D name2
谢谢
您只调用了一次 get_colors()
并将存储的颜色(在 colors
中)分配给两条消息。像下面这样为每次迭代生成随机颜色:
for msg in [msg1, msg2]:
msg = '{colors[name]} {name}'.format(colors=defaultdict(get_color), **msg)
print(msg)
循环完成后打印 colors
将显示
defaultdict(<function get_color at 0x7f6e7faed1e0>, {'name': '67C80A'})
即color
只有一个键。您正在使用硬编码密钥 'name'
访问 colors['name']
,而不是使用动态名称访问 colors[name]
。
您还需要一个格式化步骤。一个用于构建模板,另一个用于将 colors[name]
插入模板。
import random
from collections import defaultdict
def get_color():
print('call')
return ''.join([random.choice('0123456789ABCDEF') for j in range(6)])
colors = defaultdict(get_color)
msg1 = {'name' : 'name1'}
msg2 = {'name' : 'name2'}
for msg in [msg1, msg2]:
msg_template = '{{colors[{name}]}} {{name}}'.format(**msg)
print(msg_template) # for demo purposes
msg = msg_template.format(colors=colors, **msg)
print(msg)
输出
{colors[name1]} {name}
call
A70B47 name1
{colors[name2]} {name}
call
55709A name2
我将生成与打印分开,以便于阅读。你可以简化你的代码,它会容易得多。
import random
from collections import defaultdict
def generate_color():
color = ''.join([random.choice('0123456789ABCDEF') for j in range(6)])
print ('generate_color returns', color)
return color
colors = defaultdict(generate_color)
# simplify this. It's just a list of names
names = ['name1', 'name2']
# to call generate_color once for each name,
# all you need to do is access that name in the default dict
print ('building colors')
for name in names:
colors[name]
# now you have populated colors.
print ('printing colors')
for key in colors:
# I went with simplifying the format string
print ('{} {}'.format(key, colors[key]))
我正在尝试为每个用户名生成随机颜色。
我写这个代码的时候name1和name2的颜色是一样的。这里有什么问题?
import random
from collections import defaultdict
def get_color():
print('call')
return ''.join([random.choice('0123456789ABCDEF') for j in range(6)])
colors = defaultdict(get_color)
msg1 = {'name' : 'name1'}
msg2 = {'name' : 'name2'}
for msg in [msg1, msg2]:
msg = '{colors[name]} {name}'.format(colors=colors, **msg)
print(msg)
输出:
call
72C44D name1
72C44D name2
谢谢
您只调用了一次 get_colors()
并将存储的颜色(在 colors
中)分配给两条消息。像下面这样为每次迭代生成随机颜色:
for msg in [msg1, msg2]:
msg = '{colors[name]} {name}'.format(colors=defaultdict(get_color), **msg)
print(msg)
循环完成后打印 colors
将显示
defaultdict(<function get_color at 0x7f6e7faed1e0>, {'name': '67C80A'})
即color
只有一个键。您正在使用硬编码密钥 'name'
访问 colors['name']
,而不是使用动态名称访问 colors[name]
。
您还需要一个格式化步骤。一个用于构建模板,另一个用于将 colors[name]
插入模板。
import random
from collections import defaultdict
def get_color():
print('call')
return ''.join([random.choice('0123456789ABCDEF') for j in range(6)])
colors = defaultdict(get_color)
msg1 = {'name' : 'name1'}
msg2 = {'name' : 'name2'}
for msg in [msg1, msg2]:
msg_template = '{{colors[{name}]}} {{name}}'.format(**msg)
print(msg_template) # for demo purposes
msg = msg_template.format(colors=colors, **msg)
print(msg)
输出
{colors[name1]} {name}
call
A70B47 name1
{colors[name2]} {name}
call
55709A name2
我将生成与打印分开,以便于阅读。你可以简化你的代码,它会容易得多。
import random
from collections import defaultdict
def generate_color():
color = ''.join([random.choice('0123456789ABCDEF') for j in range(6)])
print ('generate_color returns', color)
return color
colors = defaultdict(generate_color)
# simplify this. It's just a list of names
names = ['name1', 'name2']
# to call generate_color once for each name,
# all you need to do is access that name in the default dict
print ('building colors')
for name in names:
colors[name]
# now you have populated colors.
print ('printing colors')
for key in colors:
# I went with simplifying the format string
print ('{} {}'.format(key, colors[key]))