在python中的列表解析中创建一个配音复制项

create a dubs duplication item in a list comprehension in python

我想在python的列表理解中创建一个重复项

在python中,在一个列表理解中可以有多个迭代器,比如

1
[(x,y) for x in a for y in b]

对于一些合适的序列A和B,我知道Python列表理解的循环语义。

我的问题是:理解中的迭代器可以引用另一个吗?换言之:我可以要这样的东西吗?

1
2
3
4
arr = [1,2,3,4]
dubs = []
dubs = [[x] + [arr[arr.index(x)]] for x in ]
dubs = [x for l in dubs for x in l]

例如,如果我有一个简单的列表:

1
arr = [1,2,3,4]

为了达到这个结果,列表理解表达式是什么:

1
dubs = [1, 1, 2, 2, 3, 3, 4, 4]

请只列出理解答案。


如果要更改现有代码以使其正常工作,请先构建嵌套列表,然后将其扁平化:

1
2
dubs = [[x]+[x] for x in arr]
dubs = [x for l in dubs for x in l]

换言之,您需要循环的东西(您似乎被卡住的东西)只是EDOCX1的元素(0),而您需要添加到每个元素singleton [x]中的东西只是[x]的另一个副本。使用你的[arr[arr.index(x)]],你试图在数组中查找x,这样你就可以得到你发现的任何东西的值,如果它起作用的话,它就是x,所以只需使用x

你可以做得更好一点:

1
2
dubs = [[x]*2 for x in arr]
dubs = [x for l in dubs for x in l]

或者,当然:

1
2
dubs = [[x,x] for x in arr]
dubs = [x for l in dubs for x in l]

但这样做可能更简单,即使不够简洁:

1
2
dubs = [[x for _ in range(2)] for x in arr]
dubs = [x for l in dubs for x in l]

然后,正如JPP在评论中指出的,您可以将其简化为:

1
dubs = [x for x in arr for _ in range(2)]

或者,也可以注意到,上述所有内容与[list(z) for z in zip(arr, arr)]的内容相同。如果我们只是展平zip,我们不需要将其转换为列表列表而不是元组迭代器,只需按原样使用它:

1
2
dubs = zip(arr, arr)
dubs = [x for l in dubs for x in l]

…您可以再次简化:

1
[x for l in zip(arr, arr) for x in l]


在我看来,你想要索引和项目,而不是项目两次。在这种情况下,您需要使用enumerate()enumerate()的第二个参数指定返回(index,value)元组时要使用的起始索引。从0开始,省略start参数。

1
dubs = [(i, v) for i, v in enumerate(arr,1)]

这将给出一个tuples列表,它可以被展平为@abarnett所示。

1
dubs = [x for l in dubs for x in l]


将同一元素循环两次,然后将导致重复

1
2
In [6]: [i for i in arr for h in range(2)]
Out[6]: [1, 1, 2, 2, 3, 3, 4, 4]

简单的,如果你已经排序了列表,就没有列表理解

1
2
In [7]: sorted(arr*2)
Out[7]: [1, 1, 2, 2, 3, 3, 4, 4]