python - 在 Python 中给定一个奇数长度的值列表,我如何交换列表中除最终值之外的所有值?

标签 python list

关于 Python 2.7.12(免责声明:我知道 Python2 正在逐步淘汰到 Python3,但我正在学习的类(class)从这里开始,也许是为了理解旧代码库):

我有一个整数列表,我想用它们的相邻值交换每个整数。到目前为止,这对于包含的整数个数为偶数的列表非常有效,但是当列表长度为奇数时,简单地交换每个值并不容易,因为整数个数是不均匀的。

给出以下代码示例,我如何交换列表中除 final 值之外的所有值?

arr = [1, 2, 3, 4, 5]

def swapListPairs(arr):
    for idx, val in enumerate(arr):
        if len(arr) % 2 == 0:
            arr[idx], arr[val] =  arr[val], arr[idx]  # traditional swap using evaluation order
        else:
            arr[0], arr[1] = arr[1], arr[0]  # this line is not the solution but where I know I need some conditions to swap all list values other than len(arr)-1, but am not sure how to do this?
    return arr

print swapListPairs(arr)

最终 Pythonic Master 的奖励积分:如何修改此代码以也交换字符串?现在,我只能使用整数来使用这个函数,我很好奇如何才能使它同时适用于 intstr 对象?

非常感谢您给我指明正确方向的任何见解或建议!有时,这里每个人的帮助都是无价的,感谢您的阅读和帮助!

最佳答案

这是一种基于切片分配的更短、可能更快的方法:

def swap_adjacent_elements(l):
    end = len(l) - len(l) % 2
    l[:end:2], l[1:end:2] = l[1:end:2], l[:end:2]

切片分配选择 l 中所有偶数索引 (l[:end:2]) 或所有奇数索引 (l[1: end:2]) 直到并排除索引 end,然后使用您已经用于交换切片的相同类型的交换技术。

end = len(l) - len(l) % 2 选择停止的索引。我们通过减去 len(l) % 2end 设置为小于或等于 len(l) 的最接近的偶数,当len(l) 除以 2。

或者,我们可以使用按位运算完成 end = len(l) & ~1。这将构造一个整数用作掩码 (~1),第 1 位为 0,其他位置为 1,然后将掩码(使用 &)应用于将 len(l) 的第 1 位设置为 0 以产生 end

关于python - 在 Python 中给定一个奇数长度的值列表,我如何交换列表中除最终值之外的所有值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38840017/

相关文章:

C# Linq 检查列表列表是否在列表列表中

python - 如何在 Python 中传播树节点

python - 非常快地增量增加 Sprite 位置,没有滞后 - Python

Python Zipline 离线测试

python - Django 的扩展是如何工作的?

python - 在 python 中读取列表

python - Django:未定义HttpResponseRedirect

java - 根据运行时属性对对象列表进行排序

c++ - 代码行在两行之后不起作用

python - 删除列表中的项目并获取新列表?