我有一个列表字典,如下所示:
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了很多,但找不到相关信息。任何帮助将不胜感激。
我有一个列表字典,如下所示:
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了很多,但找不到相关信息。任何帮助将不胜感激。
如果没有显式或隐式循环,真的没有办法做到这一点。
也就是说,您可以执行以下操作之一:
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 慢一点,但这也可能根本不重要。)
next(x for x in D.itervalues() if 'b' in x)
如果您需要像这样按值查找内容,那么您使用的是错误的数据结构。为此,您应该构建一个倒排索引,将值映射到与其对应的键。(您可以在构建字典时构建此倒排索引。)一旦您拥有该键,您就可以轻松地在原始字典中查找包含列表。如果由于某种原因您无法在构建字典时构建倒排索引(可能是因为您没有构建它,它只是交付给您),您可以像这样构建倒排索引:
inverted_index = {v : k for k, l in d.items() for v in l}
在这里,我使用d
的是你的字典的名称,而不是dict
因为dict
是你永远不应该隐藏的内置类型的名称。