【问题标题】:How to swap values in python?如何在python中交换值?
【发布时间】:2015-05-16 09:59:22
【问题描述】:

我知道如何将两个变量交换在一起,但我想知道是否有更快的方法来遵循某种模式。

所以我有这个号码列表。 list=[1,2,3,4,5,6] 我想要做的是将一个数字与下一个数字交换,并将下一个数字与它后面的数字交换。所以在交换它们之后它会变成list=[2,1,4,3,6,3] 所以我想知道是否有一种方法可以更简单地交换数字。谢谢。

【问题讨论】:

  • 你的意思是[2,1,4,3,6,5] 吗?
  • 您正在寻找比什么“更快的方法”?到目前为止你有什么?
  • list[0], list[1] = list[1], list[0] 与元组分配作品
  • >>> t= [1,2,3,4,5,6] >>> index1 = t.index(1) >>> index2 = t.index(2) >> > t[index1], t[index2] = 2,1 >>> t
  • 我想要更快的原因是因为我有大约 20 个号码要交换,所以需要很长时间,我需要一些简单易懂的东西

标签: python list variables numbers swap


【解决方案1】:
lst = [1,2,3,4,5,6] # As an example
for x in range(0, len(lst), 2):
    if x+1 == len(lst): # A fix for lists which have an odd-length
        break 
    lst[x], lst[x+1] = lst[x+1], lst[x]

这不会创建新列表。

编辑:经过测试,它甚至比列表理解还要快。

【讨论】:

  • 非常感谢,这是一个非常简单的方法,如果可能的话,您能否解释一下发生了什么。非常感谢。
  • 这段代码基本上交换了列表中的每两个元素,这就是我为 range() 提供第三个参数的原因。 “If 语句”对于奇数长度的列表是必要的,因为在某一时刻,循环到达列表中的最后一个元素,并且它旁边没有一个元素来执行交换,这部分代码你没有'不明白?
  • 是的,我知道它将两个元素交换在一起。 for x in range(0, len(lst), 2): 这是我有点困惑的部分,但这可能是因为我对 for 循环不太了解。非常感谢您的帮助。
  • 还有关于 x+1 代表什么?对不起。我对python有点陌生,所以我还不知道很多。非常感谢您的帮助。
  • 列表 [1,2,3,4,5,6] 有 6 个元素,所以长度为 6,所以 range(0, len(lst), 2) == range(0, 6, 2) - 我想你知道 range(0,6) 做什么,它返回一个包含 [0,1,2,3,4,5], range(0,6,2) 的列表做同样的事情,但它返回一个包含 [0, 2, 4] 的列表,换句话说,它跳过所有其他元素,因此返回原始列表中元素数量的一半
【解决方案2】:

如果您的列表长度相等,这可能是最简单的方法:

>>> lst = [1,2,3,4,5,6]
>>> [lst[i^1] for i in range(len(lst))]
[2, 1, 4, 3, 6, 5]

【讨论】:

  • 如果它有奇数长度怎么办
  • 该死...好吧,我真的不想处理这个,只是说这需要一个均匀的长度(这对他来说总是如此)。
【解决方案3】:

我的解决方案使用funcy

示例:

>>> from funcy import chunks, mapcat
>>> xs = [1, 2, 3, 4, 5, 6]
>>> ys = mapcat(reversed, chunks(2, xs))
>>> ys
[2, 1, 4, 3, 6, 5]

这种读起来也不错;连接和映射 xs 的每个 2 对块的反转结果。

【讨论】:

    【解决方案4】:
    from itertools import chain
    from itertools import izip_longest
    
    In [115]: li
    Out[115]: [1, 2, 3, 4, 5, 6, 7]
    
    In [116]: [i for i in list(chain(*(izip_longest(li[1::2],li[0::2])))) if i!=None]
    Out[116]: [2, 1, 4, 3, 6, 5, 7]
    

    或者如果你有偶数列表

    a[start:end:step] # start through not past end, by step
    

    查看此了解List slice notation

    In [65]: li
    Out[65]: [1, 2, 3, 4, 5, 6]
    
    In [66]: new=[None]*(len(li))
    
    In [71]: new[0::2]=li[1::2]
    
    In [73]: new[1::2]=li[0::2]
    
    In [74]: new
    Out[74]: [2, 1, 4, 3, 6, 5]
    

    【讨论】:

    • 非常感谢,这是一种非常简单的方法,如果可能的话,您能否解释一下发生了什么。非常感谢。
    • 非常感谢,非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-12
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    • 2023-02-04
    • 1970-01-01
    相关资源
    最近更新 更多