我想在python
中的列表解析中创建一个复制项在Python中,您可以在列表推导中使用多个迭代器,例如
[(x,y) for x in a for y in b]
对于一些合适的序列a和b。我知道Python列表推导的循环语义。
我的问题是:理解中的迭代器可以引用另一个吗?换句话说:我可以这样:
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]
例如,如果我有一个简单的列表:
arr = [1,2,3,4]
列表理解表达式将实现此结果:
dubs = [1, 1, 2, 2, 3, 3, 4, 4]
请仅列出理解答案。
答案 0 :(得分:2)
如果您想通过首先构建嵌套列表然后展平它来更改现有代码以使其工作:
dubs = [[x]+[x] for x in arr]
dubs = [x for l in dubs for x in l]
换句话说,你需要循环的东西(你似乎坚持的东西)只是arr
的元素,你需要添加到每个元素单身[x]
只是[x]
的另一个副本。使用[arr[arr.index(x)]]
,您只是试图在数组中查找x
,这样您就可以找回您找到的任何值 - 如果只是x
它有效,所以只需使用x
。
你可以稍微好一些:
dubs = [[x]*2 for x in arr]
dubs = [x for l in dubs for x in l]
或者,当然:
dubs = [[x,x] for x in arr]
dubs = [x for l in dubs for x in l]
但这样做可能更简单,即使不那么简洁:
dubs = [[x for _ in range(2)] for x in arr]
dubs = [x for l in dubs for x in l]
然后,正如jpp在评论中指出的那样,您可以将其简化为:
dubs = [x for x in arr for _ in range(2)]
或者,或者,请注意上述所有内容都给我们与[list(z) for z in zip(arr, arr)]
相同的内容。如果我们只是压缩拉链,我们不需要将它转换为列表而不是元组的迭代器,只需按原样使用它:
dubs = zip(arr, arr)
dubs = [x for l in dubs for x in l]
......你可以再次简化:
[x for l in zip(arr, arr) for x in l]
答案 1 :(得分:0)
在我看来,你想要索引和项目而不是项目两次。在这种情况下,您将需要使用enumerate()
。 enumerate()
的第二个参数指定返回(索引,值)元组时使用的起始索引。从0
开始省略start
参数。
dubs = [(i, v) for i, v in enumerate(arr,1)]
这将给出一个元组列表,这些元组可以展平为@abarnert显示
dubs = [x for l in dubs for x in l]
答案 2 :(得分:-2)
将相同的元素循环两次然后重复
In [6]: [i for i in arr for h in range(2)]
Out[6]: [1, 1, 2, 2, 3, 3, 4, 4]
简单的没有列表理解如果你有排序列表
In [7]: sorted(arr*2)
Out[7]: [1, 1, 2, 2, 3, 3, 4, 4]