1

我有一个列表字典,如下所示:

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

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

IE,

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

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

4

3 回答 3

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其他任何地方,但是您仍然必须搜索该序列以找到True. 你在这里想要的是filter. 您可以将上面的geneexpr 解决方案编写为:

key = next(filter(lambda lst: 'b' in lst, d.values()))

这与genexpr 几乎完全相同。(在 CPython 中,它可能比显式循环快一点,比genexpr 慢一点,但这也可能根本不重要。)

于 2013-07-02T02:10:36.430 回答
0
next(x for x in D.itervalues() if 'b' in x)
于 2013-07-02T02:07:50.213 回答
0

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

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

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

于 2013-07-02T02:20:59.660 回答