我要做的是定义三个非常相似的词典,只有细微的差别。如果您认识到这是Codeacademy关于Python的课程中的一个问题,我希望能够更优雅地完成它。无论如何,这就是我所拥有的:
import string
for name in ["lloyd", "alice", "tyler"]:
name = {"name": string.capitalize(name), "homework": [], "quizzes": [], "tests": []}
这不起作用。我想要的是三个字典,其名称为“lloyd”“alice”和“tyler”以及他们的名字键(但是大写),“家庭作业”,“测验”和“测试”
为了澄清,我想要的输出等同于:
lloyd = {"name": "Lloyd", "homework": [], "quizzes": [], "tests": []}
alice = {"name": "Alice", "homework": [], "quizzes": [], "tests": []}
tyler = {"name": "Tyler", "homework": [], "quizzes": [], "tests": []}
答案 0 :(得分:3)
我认为不是为每个名称创建变量,而是可以创建名称的dict,每个名称都指向一个字典。
>>> names=["lloyd", "alice", "tyler"]
>>> keys=["homework", "quizzes", "tests"]
>>> dic={ name.capitalize():{ key:[] for key in keys} for name in names}
>>> dic
{'Tyler': {'quizzes': [], 'tests': [], 'homework': []},
'Lloyd': {'quizzes': [], 'tests': [], 'homework': []},
'Alice': {'quizzes': [], 'tests': [], 'homework': []}}
现在访问Tyler
只需使用:
>>> dic['Tyler']
{'quizzes': [], 'tests': [], 'homework': []}
答案 1 :(得分:0)
您的代码适合我,在名为dict
的末尾留下一个name
,其名称列表中的姓氏为'name'
下的值。也许你的意思是将所有name
个词组添加到列表中?
all_dicts = []
for name in names:
name = {yadda yadda}
all_dicts.append(name)
甚至制作新的词典,然后将新词典的键设置为从列表中提取的名称。
答案 2 :(得分:0)
在python中,无法在运行时创建本地变量。您必须明确地为它们分配值。
这样的事情:
locals()['lloyd'] = {...}
locals()['alice'] = {...}
locals()['tyler'] = {...}
不创建本地变量lloyd
,alice
和tyler
:
>>> def some_function():
... locals()['lloyd'] = {}
... print lloyd
...
>>> some_function()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in some_function
NameError: global name 'lloyd' is not defined
引用locals()
的文档:
注意不应修改此词典的内容; 更改可能不会影响解释程序使用的本地和自由变量的值。
可以做的是使用globals()
返回的字典在运行时创建全局变量。
虽然我不明白为什么你应该这样做。
但是,您可以使用copy
模块来避免重复dict
定义:
import copy
base_dict = {"homework": [], "quizzes": [], "tests": []}
lloyd = copy.deepcopy(base_dict)
alice = copy.deepcopy(base_dict)
tyler = copy.deepcopy(base_dict)
for the_dict, name in ((lloyd, "lloyd"), (alice, "alice"), (tyler, "tyler")):
the_dict["name"] = name.capitalize()
或没有循环:
import copy
base_dict = {"homework": [], "quizzes": [], "tests": []}
lloyd = copy.deepcopy(base_dict)
alice = copy.deepcopy(base_dict)
tyler = copy.deepcopy(base_dict)
lloyd["name"], alice["name"], tyler["name"] = "lloyd", "alice", "tyler"
使用defaultdict
取决于您想要做的事情可能是一个好主意:
from collections import defaultdict
lloyd = defaultdict(list)
alice = defaultdict(list)
tyler = defaultdict(list)
lloyd["name"], alice["name"], tyler["name"] = "lloyd", "alice", "tyler"
defaultdict
,而不是在找不到密钥时引发KeyError
,而是创建默认值(在本例中为空list
)并将该值设置为值密钥,因此您无需指定"tests": []
。
答案 3 :(得分:0)
您需要的不是很清楚
如果你想要带有键的字典["lloyd", "alice", "tyler"]
中的名字,那就是这样做
import string
dictionaries = {} # dicts
for name in ["lloyd", "alice", "tyler"]:
dictionaries[string.capitalize(name)]={"homework": [],
"quizzes": [], "tests": []}
结果是
>>> dictionaries
{'Tyler': {'quizzes': [], 'tests': [], 'homework': []},
'Lloyd': {'quizzes': [], 'tests': [], 'homework': []},
'Alice': {'quizzes': [], 'tests': [], 'homework': []}}
答案 4 :(得分:0)
class Student:
def __init__(self,name):
self.name=name.capitalize()
self.quizzes=[]
self.tests=[]
self.homework=[]
#this
Jane =Student('jane')
JanesDict = Jane.__dict__
#or
JimsDict = Student('jim').__dict__
prety很多为一个新学生创建一个字典。