我想从两个列表x
和y
构造列表z
。我希望将y
中的所有元素放置在ypos
元素指向的位置。例如:
y = [11, 13, 15]
z = [12, 14]
ypos = [1, 3, 5]
因此,
x
必须为[11, 12, 13, 14, 15]
另一个例子:
y = [77]
z = [35, 58, 74]
ypos = [3]
因此,
x
必须为[35, 58, 77, 74]
我已经编写了可以实现我想要的功能的函数,但是看起来很丑陋:
def func(y, z, ypos):
x = [0] * (len(y) + len(z))
zpos = list(range(len(y) + len(z)))
for i, j in zip(y, ypos):
x[j-1] = i
zpos.remove(j-1)
for i, j in zip(z, zpos):
x[j] = i
return x
如何用pythonic方式编写它?
最佳答案
如果列表很长,请重复调用insert
might not be very efficient。或者,您可以从列表中创建两个iterators
,并通过从两个迭代器中的任意一个迭代器获取next
元素来构造列表,具体取决于当前索引是否在ypos
(或其set
)中:
>>> ity = iter(y)
>>> itz = iter(z)
>>> syp = set(ypos)
>>> [next(ity if i+1 in syp else itz) for i in range(len(y)+len(z))]
[11, 12, 13, 14, 15]
注意:这将按照
y
本身中出现的顺序插入y
中的元素,即y
的第一个元素插入ypos
中的最低索引,而不必插入ypos
的第一个索引。如果y
的元素应插入到ypos
的相应元素的索引处,则ypos
必须按升序排列(即ypos
的第一个索引也是最低的),或者y
的迭代器必须按以下顺序排序与ypos
中的索引顺序相同(此后,无需对ypos
本身进行排序,因为无论如何我们都将其转换为set
)。>>> ypos = [5,3,1] # y and z being same as above
>>> ity = iter(e for i, e in sorted(zip(ypos, y)))
>>> [next(ity if i+1 in syp else itz) for i in range(len(y)+len(z))]
[15, 12, 13, 14, 11]
关于python - 以pythonic方式合并具有特定合并顺序的列表?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47443332/