Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 获取子集中元素的索引_Python_Python 2.7 - Fatal编程技术网

Python 获取子集中元素的索引

Python 获取子集中元素的索引,python,python-2.7,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 li

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

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']
当我将
转换为index(list1,list2)
时,我希望发生的是输出为
[2,0,1]

然而,当我这样做时,我得到一个
ValueError:“0”
不在列表中

但是,0在这两个列表中都没有出现,因此我不确定为什么会出现这种情况

其次,如果我有一个列表列表,我想处理大列表中的所有嵌套列表,我会这样做吗

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

其中,
dict\u of\u index
是根据最上面的答案创建的索引字典。

问题在于,你不是一次一次地这样做,而是一次又一次地这样做,N次:

 for i in range(len(listof_elements)):
      listof_elements[:] = [listof_indices.index(x) for x in listof_elements]
第一次通过,您将
listof_elements
中的每个值替换为
listof_index
中的索引。到目前为止,一切顺利。事实上,你应该在那里完成

但是你再做一次。您可以在
listof_index
中查找这些索引,就像它们是值一样。有些人不在那里。所以你得到了一个错误

您只需删除外部循环即可解决此问题。第一次之后,你已经完成了

您可能会感到困惑,因为这个问题似乎天生就需要两个循环,但您已经有了两个循环。第一个是列表理解中显而易见的一个,第二个是隐藏在
listof_index.index
中的一个


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

您可以预先循环查找每个
x
,以构建字典,而不是循环查找
listof_索引

dict_of_indices = {value: index for index, value in enumerate(listof_indices)}
listof_elements[:] = [dict_of_indices[x] for x in listof_elements]
然后直接在字典中查找:

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)
time而不是
O(N*M)
),我认为这可能更容易理解和调试。第一行可能有点棘手,但您可以轻松打印出dict并验证它是否正确。然后第二行是你能得到的最简单的东西。

你能举例说明你想要什么吗?如何显示元素列表、索引列表以及你想要返回的内容?根据我的理解,你的输出应该是
[1,2,0]
,而不是
[2,0,1]
。我说的对吗?哇,就是这么简单的哈哈。很有道理,谢谢你!还有一个问题:如果我有一个列表列表,我想要另一个列表列表,对大列表中的每个列表都执行此操作,那么我就必须使用for循环,对吗?类似于biglist中的smalllist:smalllist[:]=[dict_of_index[x]for x in smalllist]@user5145575是的,没错。(除了不生成其他列表外,它正在修改现有列表。这是您想要的吗?)