gpt4 book ai didi

python - 以与另一个列表相同的顺序放置一个列表

转载 作者:太空狗 更新时间:2023-10-30 02:02:40 24 4
gpt4 key购买 nike

有一堆措辞相似的问题,但我找不到真正符合我预期语义的问题。

有两个列表,AB ,我想重新排列 B所以它的相对顺序与 A 相同- B 的最大元素与A的最大元素当前位置相同, 最小元素同理,以此类推。

请注意 A未排序,我也不希望它排序。

例如,如果输入以下内容:

a = [7, 14, 0, 9, 19, 9]
b = [45, 42, 0, 1, -1, 0]

我希望输出为 [0, 42, -1, 0, 45, 1] .

请注意,预期的输出不是 [0, 45, 1, 0, 42, -1] ,这就是你将两者压缩并按 A 排序的结果并获取 B 的结果元素(这是我看过的所有其他问题都想要的)。

这是我的代码:

def get_swaps(x):
out = []

if len(x) <= 1:
return out

y = x[:]
n = -1

while len(y) != 1:
pos = y.index(max(y))
y[pos] = y[-1]
y.pop()
out.append((pos, n))
n -= 1

return out

def apply_swaps_in_reverse(x, swaps):
out = x[:]
for swap in swaps[::-1]:
orig, new = swap
out[orig], out[new] = out[new], out[orig]
return out

def reorder(a, b):
return apply_swaps_in_reverse(sorted(b), get_swaps(a))

该方法基本上是构建一个对 A 进行排序所需的交换列表。通过选择排序,排序B ,然后反向应用这些交换。这有效,但速度很慢(而且也很困惑)。对此有更好的方法吗?

最佳答案

a = [7, 14, 0, 9, 19, 9]
b = [45, 42, 0, 1, -1, 0]
print zip(*sorted(zip(sorted(b), sorted(enumerate(a), key=lambda x:x[1])), key=lambda x: x[1][0]))[0]
#or, for 3.x:
print(list(zip(*sorted(zip(sorted(b), sorted(enumerate(a), key=lambda x:x[1])), key=lambda x: x[1][0])))[0])

结果:

(0, 42, -1, 0, 45, 1)

您对 a 进行排序,使用 enumerate 来跟踪每个项目的原始索引。您使用 sorted(b) 压缩结果,然后根据 a 的原始索引对整个内容重新排序。然后您再次调用 zip 以仅提取 b 的值。

关于python - 以与另一个列表相同的顺序放置一个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39755045/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com