3

我要做的是定义三个非常相似的字典,只有细微的差别。如果您认识到这是 Python Codeacademy 课程中的问题之一,我希望做得更优雅一点。无论如何,这就是我所拥有的:

import string
for name in ["lloyd", "alice", "tyler"]:
    name = {"name": string.capitalize(name), "homework": [], "quizzes": [], "tests": []}

这是行不通的。我想要的是三本字典,它们的名字分别是“lloyd”、“alice”和“tyler”,以及他们名字的键(但大写)、“homework”、“quizzes”和“tests”

为了澄清,我想要的输出相当于:

lloyd = {"name": "Lloyd", "homework": [], "quizzes": [], "tests": []}
alice = {"name": "Alice", "homework": [], "quizzes": [], "tests": []}
tyler = {"name": "Tyler", "homework": [], "quizzes": [], "tests": []}
4

5 回答 5

6

我认为您可以创建一个名称字典,每个名称都指向一个字典,而不是为每个名称创建一个变量。

>>> 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': []}
于 2013-05-02T18:46:37.470 回答
2

在 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"

取决于你想做什么使用 adefaultdict可能是一个好主意:

from collections import defaultdict
lloyd = defaultdict(list)
alice = defaultdict(list)
tyler = defaultdict(list)
lloyd["name"], alice["name"], tyler["name"] = "lloyd", "alice", "tyler"

,而不是在找不到键时defaultdict引发 a ,而是创建一个默认值(在本例中为空)并将该值设置为键的值,因此您无需指定.KeyErrorlist"tests": []

于 2013-05-02T18:50:06.783 回答
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': []}}
于 2013-05-02T19:00:15.873 回答
0

您的代码对我有用,在名称列表中以姓氏dict命名的末尾留下一个作为. 也许您的意思是将所有字典添加到列表中?name'name'name

all_dicts = []

for name in names:
   name = {yadda yadda}
   all_dicts.append(name)

或者甚至制作一个新字典,然后将该新字典的键设置为从列表中提取的名称。

于 2013-05-02T18:48:03.820 回答
-1

编辑:这是 hacky AF。它有效,但如果我在我的代码库中看到这个,我会皱眉。

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__

几乎为一个新学生创建了一本字典。

于 2013-05-02T20:16:36.260 回答