2013-07-02 90 views
1

我有列表的字典象下面这样:如何访问包含字典中特定项目的列表?

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

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

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

我想获得含 'B' 列表中的对象,那就是list1,使用map而不是使用明确的for循环。我GOOGLE了很多,但无法找到相关信息。任何帮助将不胜感激。

+2

请注意,调用字典“dict”是个不错的主意。一旦你这样做了,你就不能再访问内建类型和同名的构造函数了。 – abarnert

回答

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并没有给你任何方式去做你想做的事情;您可以使用它来创建一个新的序列,而不是包含'b'False以及其他地方的列表,但是您仍然必须搜索该序列以找到True。你在这里想要的是filter。您可以将上面的genexpr解决方案写成:

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

而这与genexpr几乎完全一样。 (在CPython中,它可能比显式循环快一点,比genexpr慢一些,但这也可能根本就没有关系。)

+0

+1,'没有明确的或隐含的循环,真的没有办法做到这一点。' – John

+0

@johnthexiii:实际上,我并不喜欢我写的方式。 genexpr/comp中的for循环非常明确,即使在拼写中也是如此。但我不知道如何以新手友好的方式进行区分... – abarnert

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

如果您需要查看,请使用错误的数据结构像这样的价值。为此,您应该构建一个inverted index,将值映射到与其对应的键。 (你可以在建立你的字典时建立这个倒排索引。)一旦你有了这个键,你可以很容易地在原始字典中查找包含的列表。如果由于某种原因,为您打造字典(也许是因为你没有构建它,它只是提供给你),你不能建立倒排索引,你可以建立倒排索引是这样的:

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

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

+0

首先,他的字典值是列表,所以这是行不通的。 (你不能使用列表作为字典键。)而且,即使它确实起作用,也不能解决他的问题,即查看每个列表中的任何单个元素,而不是列表本身。 – abarnert

+0

@abamert:没有。如果您将这些行输入交互模式,>>> >>> d = {'key1':['a','b','c'],'key2':['d','e','f'] } >>> inverted_index = {v:k for k,l in d.items()for v in l} >>> print inverted_index'你会看到输出'{'a':'key1',' b':'key1','c':'key1','d':'key2','e':'key2','f':'key2'}'然后你可以通过' >>> inverted_index ['b']'这将产生'key1'和通过>>> d [inverted_index ['b']]产生'['a','b','c' ]'。那就是,*正是他想要的。所以,它*确实*起作用,并且它*解决了他的问题。 – jason

+0

对不起,我在最后没有看到额外的'for v in l'。你是对的。但它仍然映射到键,而不是他要求的列表,这就是为什么你需要额外的步骤'd [inverted_index ['b']]'而不是'inverted_dict ['b']''。如果他真的需要钥匙,那是一个优点;如果他不这样做,那没有任何理由,这太复杂了。 – abarnert

相关问题