我有以下元组列表:
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)]
我在哪里做错了?
答案 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)