2012-10-20 84 views
1
a = [[1,2,3],[4,5,6]] 

我想获得0123并获得1456拥有列表清单 - 如何获取包含项目的列表的索引?

当然

我可以做这样的事情:

def get_index(my_list, my_item): 
    for i, j in enumerate(my_list): 
     if my_item in j: 
      return i 
    raise ValueError("Item not in any list") 

是否有这样做的更好的办法?

+0

我想您的解决方案几乎没有改进的余地。 – hochl

+0

是不是有一个很好的Python单线? – zenpoy

+1

'下一个(我为i,j在枚举(a)如果my_item在j)'是一个单线程,但它会在失败时引发'StopIteration',因此您的错误信息会更好。你可以添加一个默认值None或者什么,但我想我仍然更喜欢你的解决方案。如果你多次这样做,虽然它可能会更好地建立索引字典。 – DSM

回答

2

更新答:

这是我原来的答复的改进版本,由于输入从zenply的OP。

b = [[1,2,3],[4,5,6],[1,4,5], [4,7,8]] 

def create_dict_2(a): 
    my_dict = {} 
    for index, sublist in enumerate(a): 
     for ele in sublist: 
      if not ele in my_dict: 
       my_dict[ele] = index 
    return my_dict 

结果:

>>> my_dict = create_dict(b) 
>>> my_dict[4] 
1 
>>> my_dict[5] 
1 
>>> my_dict[1] 
0 
>>> my_dict[7] 
3 
+0

在重复元素的情况下,这与OP的情况略有不同; OP的代码返回首次出现的索引,并返回最后一个。 [可能这并不相关,但值得注意。] – DSM

+0

@DSM,是的,你说得对,如果所有的事件都是唯一的,我的解决方案是相同的。好点子。 – Akavall

+0

如果你反过来循环“a”,我认为它应该恢复OP的行为。 – DSM

1

不知道这是更具可读性,但它确实处理那里的多个子列表与该项目在它的情况:

def get_index(my_list, my_item): 
    indices = [i for i, sublist in enumerate(my_list) if my_item in sublist] 
    if len(indices) == 1: 
     return indices[0] 
    raise ValueError("Item not in any list or in multiple lists") 
+0

我没有在问题中明确表示,但我更喜欢获得第一个索引。 – zenpoy

+0

在这种情况下,您可以在一行中完成:'[我为i,子列表枚举(my_list)如果my_item在子列表中] [0]'尽管如果不存在IndexError, – jobby

相关问题