繁体   English   中英

如何在python列表中用奇数更大的元素交换更小的元素?

[英]How to swap even lesser elements with odd greater elements in a python list?

我有一个从 1 到 n 的元素列表,( range(1, n + 1)

我应该如何用偶数元素交换奇数更大的元素?

例如,如果我有一个包含元素[1,2,3]的列表,则所需的输出将是[1,3,2]因为奇数 3 大于偶数 2 。

例子2:

if list = [1,2,3,4,5]

所需的输出将是

[1,3,2,5,4] 

这里 2 将与 3 交换,4 将与 5 交换但不与 3 交换,因为 3 小于 4。

一个简单的 for 循环,就地修改列表:

l = list(range(1,10))

for i, n in enumerate(l):
    if i % 2 != 0 and i < len(l) - 1:
        l[i] = l[i+1]
        l[i+1] = n

在每个奇数索引处,元素与其后继者交换位置。

您可以使用偶数/奇数的列表切片,压缩它们并从中创建解决方案列表:

def interleave(n):
    k = list(range(1, n))

    k[:] = k[:1]+[y for x in zip(k[2::2], k[1::2]) 
            for y in x] + (k[-1:] if len(k)%2 == 0 else [])

    return k

print(interleave(20))
print(interleave(21))

输出:

[1, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14, 17, 16, 19, 18]
[1, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14, 17, 16, 19, 18, 20]

解释:

  • 你保持 1
  • 你得到从位置 2 到结束的所有奇数,步长 2
  • 你得到了从位置 1 到结束的所有偶数,步长 2
  • 你用 zip 交错它们
  • 您使用[x for y in sequence for y in x]的嵌套列表理解重新组合它们,其中y是通过压缩两个切片产生的元组
  • 您补偿偶数/奇数大小的输入列表

进一步阅读:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM