在Python中定义循环内的多个词典

时间:2013-05-02 18:43:47

标签: python loops dictionary

我要做的是定义三个非常相似的词典,只有细微的差别。如果您认识到这是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": []}

5 个答案:

答案 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'] = {...}

创建本地变量lloydalicetyler

>>> 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很多为一个新学生创建一个字典。