我有一个如下列表的字典:
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了很多但找不到相关信息。任何帮助将不胜感激。
答案 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
是内置类型的名称,您永远不应该隐藏它。