获取子集中元素的索引

时间:2018-07-29 21:02:51

标签: python python-2.7

我有一个列表和它的一个子集,并且想要找到子集中每个元素的索引。我目前已尝试此代码:

def convert_toindex(listof_elements, listof_indices):
     for i in range(len(listof_elements)):
          listof_elements[:] = [listof_indices.index(x) for x in listof_elements]
     return listof_elements

list1 = ['lol', 'please', 'help']
list2 = ['help', 'lol', 'please', 'extra']

convert_toindex(list1, list2)要做的事情是输出[2, 0, 1]

但是,当我这样做时,却得到ValueError: '0'不在列表中。

0,但是,在任何一个列表中都没有出现,所以我不确定为什么会这样。

第二,如果我有一个列表列表,并且我想执行此操作以处理大列表中的所有嵌套列表,我会做这样的事情吗?

for smalllist in biglist: 
     smalllist[:] = [dict_of_indices[x] for x in smalllist]

dict_of_indices是根据最高答案创建的索引字典。

1 个答案:

答案 0 :(得分:2)

问题在于,您要重复执行N次,而不是一次:

 for i in range(len(listof_elements)):
      listof_elements[:] = [listof_indices.index(x) for x in listof_elements]

第一次使用listof_elements中的索引替换listof_indices中的每个值。到目前为止,一切都很好。实际上,您应该在那里完成。

但是您第二次这样做。您可以在listof_indices中查找每个索引,就好像它们是值一样。而且其中一些不存在。所以你会得到一个错误。

您可以通过除去外部循环来解决此问题。第一次之后您已经完成。

您可能会感到困惑,因为此问题似乎固有地需要两个循环-但是您已经有两个循环。第一个是列表理解中的显而易见的一个,第二个是隐藏在listof_indices.index内部的一个。


我们正在解决这个问题:虽然这个问题不需要需要两个循环,但它不需要需要将它们嵌套。

您可以预先遍历以构建字典,而不是遍历listof_indices来查找每个x

dict_of_indices = {value: index for index, value in enumerate(listof_indices)}

然后直接在该词典中进行查找:

listof_elements[:] = [dict_of_indices[x] for x in listof_elements]

除了速度快得多(O(N+M)而不是O(N*M))之外,我认为这可能更易于理解和调试。第一行可能有点棘手,但是您可以轻松地打印出该字典并验证其正确性。然后,第二行尽可能地变得无关紧要。