如何访问包含字典中特定项的列表?

时间:2013-07-02 02:06:24

标签: python list dictionary

我有一个如下列表的字典:

dict = {'key1':list1, 'key2':list2}

list1=['a', 'b', 'c']
list2=['d', 'e', 'f']

即,

dict = {'key1': ['a', 'b', 'c'], 'key2': ['d', 'e', 'f']}

我想使用map而不是使用显式的for循环来获取包含'b'的列表的对象,即list1。我google了很多但找不到相关信息。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

如果没有显式或隐式循环,就没有办法做到这一点。

也就是说,您可以执行以下操作之一:

key = next(lst for lst in d.values() if 'b' in lst)

但无论哪种方式,这都是for循环所做的相同的事情。特别是,它与此基本相同:

for lst in d.values():
    if 'b' in lst:
        key = let
        break

......这可能正是你要写的循环。


但是,如果你要多次这样做,你可以只做一次for循环来构建一个合适的数据结构,然后你就可以每次都进行快速查找。

例如,让我们从每个列表成员构建一个映射到它所在的列表:

valmap = {val:lst for lst in d.values() for val in lst}

现在,每当您想要找出'b'所在的列表时,请执行以下操作:

valmap['b']

根据您的问题,您可能一直在询问有关使用map的问题。首先,map仍然只是一个隐式的for循环。其次,map并没有真正让你做任何你想要的事情;您可以使用它来创建一个新的序列,用True代替包含'b'的列表和其他地方的False,但是您仍然必须搜索该序列以找到{{ 1}}。你想要的是True。您可以将上面的genexpr解决方案编写为:

filter

这与genexpr几乎完全相同。 (在CPython中,它可能比显式循环快一点,并且比genexpr慢一点,但这也可能无关紧要。)

答案 1 :(得分:0)

next(x for x in D.itervalues() if 'b' in x)

答案 2 :(得分:0)

如果您需要按照这样的值查找内容,那么您使用的是错误的数据结构。为此,您应该构建一个inverted index,将值映射到与它们对应的键。 (您可以在构建字典时构建此反向索引。)一旦有了该键,就可以轻松地在原始字典中查找包含列表。如果由于某种原因你在构建字典时无法构建倒排索引(可能是因为你没有构建它,它只是交付给你),你可以像这样构建倒排索引:

inverted_index = {v : k for k, l in d.items() for v in l}

在这里,我使用d代替字典名称而不是dict,因为dict是内置类型的名称,您永远不应该隐藏它。