2012-11-23 113 views
1

我有这样的:Python列表输入搜索

[[(1, 'a')], [(2, 'b'), (2, 'c')], [(3, 'd'), (3, 'e')]] 

我想打一个输入要搜索的A/B/C/d/e和输出这封信的指数。

例如搜索a -> index=0b and c -> index=1,当d and e -> index=2

这是如何实现的Python 3.x都有

回答

2

您必须先遍历列表,然后为每个获取的列表遍历它以获取元组。

>>> my_list = [[(1, 'a')], [(2, 'b'), (2, 'c')], [(3, 'd'), (3, 'e')]] 
>>> 
>>> def search(val): 
     for index, inner_list in enumerate(my_list): 
      for nested_tuple in inner_list: 
       if val in nested_tuple: 
        return index 


>>> search('a') 
0 
>>> search('c') 
1 
>>> search('e') 
2 
+0

你并不总是在寻找'a',所以我们让它成为一个适当的功能。 –

+0

@tvdien ..没有。谢谢:) –

+0

除此之外现在有一个错误。 ;) –

2

你需要一个嵌套的循环:

def find_index (data, key): 
    for i, d in enumerate (data): 
     for t in d: 
      if t[1] == key: 
       return i 

这将返回(默认情况下)没有找到密钥时无。

+2

不是很Python的做'因为我在范围内( LEN(数据))'。而是使用'enumerate()'。 –

+0

我不知道,谢谢。我现在改了它。它确实更好。 –

3

你可以使用一个dict comprehension实现从字母映射到指数:

data = [[(1, 'a')], [(2, 'b'), (2, 'c')], [(3, 'd'), (3, 'e')]]  
mapping = {key:index for index, items in enumerate(data) for num, key in items} 
print(mapping) 

产量

{'a': 0, 'c': 1, 'b': 1, 'e': 2, 'd': 2} 
0
 python 3.2 
    lis= [[(1, 'a')], [(2, 'b'), (2, 'c')], [(3, 'd'), (3, 'e')]] 


    # method 1. list comprehension 
    >>> [i for i,v in enumerate(lis)for g in v if "a" in g] 

    # method 2. loop 

     def search(x): 
      for i,v in enumerate(lis): 
       for k in v: 
         if x in k: return i