我有两个列表:
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]