在Python中,我想将列表(比如 LL1 )与其列表的索引进行比较,并创建另一个列表(比如 LL2 )以这种方式比LL2具有与LL1相同的确切形状。我们可以看到,列表LL1 不均匀。例如:
LL1 = [[0, 1, 3, 6, 7], [3, 7], [0, 1, 2, 6, 7], [3], [0, 3, 4, 5, 8]]
LL2 = [[0, 0, 0, 0, 0], [1, 1], [2, 2, 2, 2, 2], [3], [4, 4, 4, 4, 4]]
我希望以尽可能最快的方式实现这一目标。目前,我使用以下方法:
MP = map(len, LL1)
LL2 = map( lambda x: MP[x]*[x] , range(len(LL1)) )
对于大型数据集,第二步不是很快。有没有比我正在做的更快的替代方案?我真的很感激任何帮助。
答案 0 :(得分:2)
您可以使用列表推导来一步完成此操作:
>>> LL1 = [[0, 1, 3, 6, 7], [3, 7], [0, 1, 2, 6, 7], [3], [0, 3, 4, 5, 8]]
>>> LL2 = [[i]*len(sub) for i, sub in enumerate(LL1)]
>>> LL2
[[0, 0, 0, 0, 0], [1, 1], [2, 2, 2, 2, 2], [3], [4, 4, 4, 4, 4]]
>>>
另一种方式:
>>> LL2 = [[i for _ in range(len(sub))] for i, sub in enumerate(LL1)]
>>> LL2
[[0, 0, 0, 0, 0], [1, 1], [2, 2, 2, 2, 2], [3], [4, 4, 4, 4, 4]]
>>>
不确定哪个更快......
答案 1 :(得分:1)
试试这个:
print([ [LL1.index(i)] * len(i) for i in LL1])
输出:
[[0, 0, 0, 0, 0], [1, 1], [2, 2, 2, 2, 2], [3], [4, 4, 4, 4, 4]]
当你有许多重复的元素时,上面的代码可能不够好,所以你可以试试这个:
print([[i]*len(j) for i,j in enumerate(LL1)])