在字典Python中查找键但不是KEY.lower()

时间:2015-12-03 13:36:26

标签: python python-3.x dictionary uppercase lowercase

所以我需要编写这个程序来创建一个类,该类的对象是一个以类别为键的字典,这些类别中包含的单词是值(例如:{'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

现在唯一的问题是,当我向现有类别添加新单词时,我的对象并没有真正得到更新我将首先尝试找到它,但如果我不这样做,我只会问一个新问题。

更新:没关系发现它,这是一个愚蠢的错误

1 个答案:

答案 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]