Python:将列表与其索引进行比较并创建一个新列表

时间:2017-03-18 06:21:59

标签: python list

在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)) )

对于大型数据集,第二步不是很快。有没有比我正在做的更快的替代方案?我真的很感激任何帮助。

2 个答案:

答案 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)])