按列表中每个元组的长度克隆列表中的元组

时间:2017-09-22 21:05:52

标签: python python-2.7 list tuples

我有以下元组列表:

indices = [(1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]

我正在运行以下内容并获取:

indices2 = []
for j in range(len(indices)):
    indices2.append(indices[j] * len(indices[j]))
indices2

给出了:

[(1,), (2,), (3,), (1, 2, 1, 2), (1, 3, 1, 3), (2, 3, 2, 3), (1, 2, 3, 1, 2, 3, 1, 2, 3)]

但是,我想获得:

[(1,), (2,), (3,), (1, 2), (1, 2), (1, 3), (1, 3), (2, 3), (2, 3), (1, 2, 3), (1, 2, 3),
(1, 2, 3)]

我在哪里做错了?

3 个答案:

答案 0 :(得分:1)

您可以先创建嵌套列表列表,然后在for循环后将其展平:

import itertools

indices = [(1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]

indices2 = []
for j in range(len(indices)):
    indices2.append([indices[j]]*len(indices[j]))

chain = itertools.chain(*indices2)
indices2 = list(chain)
print indices2

[indices[j]]*len(indices[j])创建每个len(indices[j])indices[j]元组的列表。然后,使用indices2将生成的嵌套列表itertools.chain展平为单个非嵌套列表。

另一种方法是嵌套for循环:

indices2 = []
for j in range(len(indices)):
    for jln in range(len(indices[j])):
        indices2.append(indices[j])

这里的循环只是附加元组len(indices[j])时间。

第一个可能更pythonic,它看起来更好,第二个更简单。第一个也可能有更多的开销,如果问题需要性能升级,应该验证。

答案 1 :(得分:0)

试试这个

indices = [(1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]
indices2=[]
for j in indices:
    indices2.append([j]*len(j))
print indices2

ur代码的问题是当重复的项目是列表时。该列表不会被克隆:所有元素都将引用相同的列表! 例如:

>>> a=[5,2,7]
>>> a*3
[5, 2, 7, 5, 2, 7, 5, 2, 7]
>>> [a]*3
[[5, 2, 7], [5, 2, 7], [5, 2, 7]]

答案 2 :(得分:0)

你几乎就在那里,你只需要使用extend如果你想要附加多个项目并将它包装在某个容器中,然后再乘以它:

>>> indices2 = []
>>> for j in range(len(indices)):
...     indices2.extend([indices[j]] * len(indices[j]))
>>> indices2
[(1,), (2,), (3,), (1, 2), (1, 2), (1, 3), (1, 3), (2, 3), (2, 3), (1, 2, 3), (1, 2, 3), (1, 2, 3)]

但是你甚至可以通过理解来缩短它:

>>> [item for item in indices for _ in range(len(item))]
[(1,), (2,), (3,), (1, 2), (1, 2), (1, 3), (1, 3), (2, 3), (2, 3), (1, 2, 3), (1, 2, 3), (1, 2, 3)]

至于为什么你的方法不起作用,当你乘以tuple时,你创建一个包含原始重复的新元组:

>>> (1, 2) * 2
(1, 2, 1, 2)

这不是你想要的,但是如果你将它包装在list然后再乘以它,你会多次重复元组作为不同的元组:

>>> [(1, 2)] * 2
[(1, 2), (1, 2)]

使用extend代替append,您只需插入“列表”的元素,因此它应该按预期工作。

然而,乘法并不真正复制,它只是多次插入相同的引用。通过使用理解来重复它,你是安全的:

>>> [(1, 2) for _ in range(2)]
[(1, 2), (1, 2)]

嵌套的理解有点复杂,但它只是用理解来替换外部循环和extend内的隐式循环。它基本上等同于:

indices2 = []
for item in indices:
    for _ in range(len(item)):  # equivalent to the implicit loop of "extend"
        indices2.append(item)