我想为列表中的每个元素提取索引



我有两个列表:

list1 = ["A", "B", "C", "D", "E"]
list2 = ["A", "A", "C", "B", "E", "A", "C", "B", "E", "D"]

我想为每个元素创建一个索引列表,如下所示:

[[0,1,5], [3, 7], [2, 6], [9], [4,8]]

我试过这个:

for i in list1:
list3 = [j for j,x in enumerate(list2) if x == i]
print(list3)

但我得到了这些单独的结果:

[0, 1, 5]
[3, 7]
[2, 6]
[9]
[4, 8]

最简单的方法是再创建一个列表并附加到该列表

In [28]: list1 = ["A", "B", "C", "D", "E"]
...: list2 = ["A", "A", "C", "B", "E", "A", "C", "B", "E", "D"]
In [29]: data = []
In [30]: for i in list1:
...:      list3 = [j for j,x in enumerate(list2) if x == i]
...:      data.append(list3)
...:
In [31]: data
Out[31]: [[0, 1, 5], [3, 7], [2, 6], [9], [4, 8]]

In [32]: data = []
In [33]: for i in list1:
...:      data.append([j for j,x in enumerate(list2) if x == i])
In [35]: data
Out[35]: [[0, 1, 5], [3, 7], [2, 6], [9], [4, 8]]

您可以将其写成列表理解。

>>> list3 = [[j for j,x in enumerate(list2) if x == i] for i in list1]
>>> list3
[[0, 1, 5], [3, 7], [2, 6], [9], [4, 8]]

但是,可以通过仅在list2上迭代一次而不对list1的每个元素迭代一次来提高时间复杂性。

>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> for idx, el in enumerate(list2):
...     d[el].append(idx)
... 
>>> res = [d[el] for el in list1]
>>> res
[[0, 1, 5], [3, 7], [2, 6], [9], [4, 8]]

你可以把它放在另一个列表理解中:

list1 = ["A", "B", "C", "D", "E"]
list2 = ["A", "A", "C", "B", "E", "A", "C", "B", "E", "D"]
list3 =[[j for j,x in enumerate(list2) if x == i] for i in list1]
print(list3)

您可以使用简单的列表理解。。类似的东西

[[j for j,x in enumerate(list2) if x == i] for i in list1]

最新更新