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
你可以做得更好一点:
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)] |
。
或者,也可以注意到,上述所有内容与
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] |
。
在我看来,你想要索引和项目,而不是项目两次。在这种情况下,您需要使用
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] |
号