在Python字典中查找key,但不查找key.lower()

在Python字典中查找key,但不查找key.lower(),python,python-3.x,dictionary,uppercase,lowercase,Python,Python 3.x,Dictionary,Uppercase,Lowercase,所以我需要编写这个程序,在这里我创建了一个类,该类的一个对象是一个以类别为键的字典,这些类别中包含的单词是值(例如:{'name':{'patrick','jane'},'规程:{'geography',…},…}) 在程序中的某个时刻(在该类中),我必须创建一个方法,该方法将类别的名称作为参数。然后我必须从那一类中随机挑选一个词。在字典中,所有键(类别)都需要小写,但当我给一个类别来选择一个单词时,这应该无关紧要 以下是我的代码(部分代码): 因此,假设我在字典中得到了一个类别“name”作为

所以我需要编写这个程序,在这里我创建了一个类,该类的一个对象是一个以类别为键的字典,这些类别中包含的单词是值(例如:{'name':{'patrick','jane'},'规程:{'geography',…},…})

在程序中的某个时刻(在该类中),我必须创建一个方法,该方法将类别的名称作为参数。然后我必须从那一类中随机挑选一个词。在字典中,所有键(类别)都需要小写,但当我给一个类别来选择一个单词时,这应该无关紧要

以下是我的代码(部分代码):

因此,假设我在字典中得到了一个类别“name”作为关键字和一系列单词,当我使用方法suggereren并将其作为参数“name”时,它可以工作,但当我给出“name”时,则self.woordenschat[category.lower()]返回一个空列表(请参见我初始化randwoord的那一行)

有人能告诉我为什么会这样吗

更新:

这就是你在字典中添加单词的方式,categorie是你给出类别的地方,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
现在唯一剩下的问题是,当我在现有类别中添加新词时,我的对象并没有真正得到更新,我会首先尝试找到它,但如果我没有,我只会问一个新问题


更新:nevermind发现了它,这是一个愚蠢的错误

事实上,在请求源代码中,有一个关于无案例的ICT对象的解决方案,可能满足了您的需要

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]

在这种情况下断言失败了吗?是的,它失败了,这只会增加我的困惑。我已经测试了代码,它工作正常。。。Dus geen idee:(请显示您初始化MadLibs实例的行
def uu init uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu(self,woordenschat={}):
永远不要使用可变的默认值。相反,
def uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu(我刚刚开始处理类)我认为这在我的情况下不起作用,因为我必须为学校做这件事,我对我的类对象有限制,因为它是用Pythia You see self测试的。_store=dict(),它存储较低的键,并且有值(key,value):键是原始名称,值是值,当您像那样使用dict['what']时,实际上它使用内部方法
\uuuuu getitem\uuuuu
因此,它在哪里找到小写并获得值([1]),所以整个机制将以小写和无大小写的形式进行查询。我发现了我的问题,就是我添加单词的方式,似乎使查找值变得混乱,尽管现在出现了一个新问题,但我将首先尝试自己解决,无论如何,谢谢
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]