将列表与字典(包含通配符)进行比较,返回值

时间:2018-08-06 10:44:04

标签: python list dictionary wildcard

我有一个包含几个字符串的列表和一个字典,该字典的字符串(包含通配符)作为键,而整数作为值。

例如这样的例子:

list1 = ['i', 'like', 'tomatoes']
dict1 = {'tomato*':'3', 'shirt*':'7', 'snowboard*':'1'}

我想遍历list1,看看dict1中是否有一个键(带有通配符)与list1中的字符串匹配,并从dict1中获得相应的值。因此,在这种情况下,3代表'tomato*'

有没有一种方法可以遍历list1,看看dict1键之一(带有通配符)是否与此特定字符串匹配,并从dict1返回值?

我知道我可以遍历dict1并将键与list1中的元素进行比较。但就我而言,这个字典非常大,此外,我还有很多清单要经过。因此,每次浏览字典都将花费太多时间。 我曾考虑过将键也转换为列表,并使用列表理解和fnmatch()来获得通配符匹配,但是返回的匹配将无法在dict中找到值(由于通配符)。< / p>

1 个答案:

答案 0 :(得分:1)

这是使用默认python包实现的数据结构,可为您提供帮助。

from collections import defaultdict


class Trie(defaultdict):
    def __init__(self, value=None):
        super().__init__(lambda: Trie(value))  # Trie is essentially hash-table within hash-table
        self.__value = value

    def __getitem__(self, key):
        node = self
        if len(key) > 1:  # allows you to access the trie like this trie["abc"] instead of trie["a"]["b"]["c"]
            for char in key:
                node = node[char]
            return node
        else:  # actual getitem routine
            return defaultdict.__getitem__(self, key)

    def __setitem__(self, key, value):
        node = self
        if len(key) > 1:  # allows you to access the trie like this trie["abc"] instead of trie["a"]["b"]["c"]
            for char in key[:-1]:
                node = node[char]
            node[key[-1]] = value
        else:  # actual setitem routine
            if type(value) is int:
                value = Trie(int(value))
            defaultdict.__setitem__(self, key, value)

    def __str__(self):
        return str(self.__value)

d = Trie()
d["ab"] = 3
print(d["abcde"])

3