所以我需要编写这个程序来创建一个类,该类的对象是一个以类别为键的字典,这些类别中包含的单词是值(例如:{'name':{' patrick','jane'},'discipline':{'geography',...},...})。
在程序中的某个时刻(在该类中)我必须创建一个方法,该方法将类别的名称作为参数。然后,我必须从该类别中选择一个随机单词。在字典中,所有键(类别)都必须是小写的,但是当我给出一个类别来从中选择一个单词时无关紧要。
这是我的代码(部分代码):
import random
class MadLibs:
def __init__(self, woordenschat = {}):
self.woordenschat = woordenschat
def suggereren(self, categorie):
assert categorie.lower() in self.woordenschat, 'onbekende categorie'
randwoord = random.choice(list(self.woordenschat[categorie.lower()]))
if categorie.isupper():
return randwoord.upper()
elif categorie.islower():
return randwoord
else:
return randwoord.capitalize()
所以说我在字典中输入了一个类别'name'作为关键字,当我然后使用方法 suggereren 并给出参数'name'时它有效,但是当我给'NAME'然后self.woordenschat [category.lower()]返回一个空列表(参见我初始化 randwoord 的行)
有人能告诉我为什么会这样吗?
更新:
这是你在字典中添加单词的方式,类别是你给出类别的地方,woorden是你给出属于该类别的新单词的地方
def leren(self, categorie, woorden):
if isinstance(woorden, (tuple, list, set)):
woorden = set(woorden)
else:
woorden = {woorden}
if categorie in self.woordenschat:
self.woordenschat[categorie.lower()].add(woord.lower() for woord in woorden)
else:
self.woordenschat[categorie.lower()] = (woord.lower() for woord in woorden)
return None
更新:
似乎我在leren中添加单词的方式是一个错误的问题:对象'生成器'没有...'添加'
这是我的新代码:
def leren(self, categorie, woorden):
if isinstance(woorden, (tuple, list, set)):
woorden = set(woorden)
else:
woorden = {woorden}
set_to_add = {woord.lower() for woord in woorden}
if categorie in self.woordenschat:
self.woordenschat[categorie.lower()].union(set_to_add)
else:
self.woordenschat[categorie.lower()] = (set_to_add)
return None
现在唯一的问题是,当我向现有类别添加新单词时,我的对象并没有真正得到更新我将首先尝试找到它,但如果我不这样做,我只会问一个新问题。
更新:没关系发现它,这是一个愚蠢的错误
答案 0 :(得分:0)
实际上,在请求源代码中,有一个关于caselessdict对象的解决方案可能满足你的需要。
import collections
class CaseInsensitiveDict(collections.MutableMapping):
def __init__(self, data=None, **kwargs):
self._store = dict()
if data is None:
data = {}
self.update(data, **kwargs)
def __setitem__(self, key, value):
# Use the lowercased key for lookups, but store the actual
# key alongside the value.
self._store[key.lower()] = (key, value)
def __getitem__(self, key):
return self._store[key.lower()][1]
def __delitem__(self, key):
del self._store[key.lower()]
def __iter__(self):
return (casedkey for casedkey, mappedvalue in self._store.values())
def __len__(self):
return len(self._store)
def lower_items(self):
"""Like iteritems(), but with all lowercase keys."""
return (
(lowerkey, keyval[1])
for (lowerkey, keyval)
in self._store.items()
)
def __eq__(self, other):
if isinstance(other, collections.Mapping):
other = CaseInsensitiveDict(other)
else:
return NotImplemented
# Compare insensitively
return dict(self.lower_items()) == dict(other.lower_items())
# Copy is required
def copy(self):
return CaseInsensitiveDict(self._store.values())
def __repr__(self):
return str(dict(self.items()))
@property
def keys(self):
return [i for i in self]
@property
def values(self):
return [self[i] for i in self]