我想从两个列表xy构造列表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/

10-11 06:20