如何执行列表的成对交换?

时间:2015-05-07 09:50:04

标签: python

我想在python中编写一个小代码,在列表中交换元素,这个程序将接受一个列表,并返回一个列表,用于交换每对相邻元素的位置:位置0和1,位置2和3 , 等等。如果列表具有奇数个元素,则最后位置的元素保持“就位”。

Before: [1,2,3,4,5]
After: [2,1,4,3,5]

这看起来很单调。 Python的方法是什么?

7 个答案:

答案 0 :(得分:2)

大多数pythonic方式:

def swappairwise(a):
  l = len(a)&-2
  a[1:l:2],a[:l:2] = a[:l:2],a[1:l:2]

答案 1 :(得分:2)

如果您始终保证拥有even个数字,那么这是一个很好的选择:

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

<强>解释

print (0^1)    #1
print (1^1)    #0
print (2^1)    #3
print (3^1)    #2
print (4^1)    #5
print (5^1)    #4

作为复习,XOR具有以下效果:

A   B | Output
---------------
0   0     0
0   1     1
1   0     1
1   1     0

官方说明:如果y中的该位为0,则输出的每个位与x中的相应位相同,如果该位为0,则它​​是x中位的补码y是1。

答案 2 :(得分:1)

在@Arpegius的上述答案的基础上,这里有一个希望更具可读性的解决方案。使用相同的方法。

def swap_list_pairwise(lis):
    """Pairwise swap of all elements in a list.

    If the number of elements is odd, the leftover element
    stays at its place.
    """
    length = len(lis)  
    # Stop at second last if length is odd, otherwise use full list. 
    end = length - 1 if length % 2 else length
    lis[1:end:2], lis[:end:2] = lis[:end:2], lis[1:end:2]

答案 3 :(得分:0)

如果您想要“pythonic”,请尝试"How do you split a list into evenly sized chunks in Python?",然后按map()来反转每个块。但是,可能不会太高效。

(哦,最后忘记了列表的flattening

答案 4 :(得分:0)

这是一种方式:

def pairwise_swap(iterable):
    for i, value in enumerate(iterable):
        if i % 2 == 0:
            saved = value
        else:
            yield value
            yield saved

>>> list(pairwise_swap(range(10)))
[1, 0, 3, 2, 5, 4, 7, 6, 9, 8]

答案 5 :(得分:0)

尝试这个怎么样?

>>> l = [1,2,3,4,5,6]
>>> pl = [l[i:i+2] for i in range(0,len(l),2)]
>>> pl
[[1, 2], [3, 4], [5, 6]]
>>> for i in pl:
...     i[0],i[1] = i[1],i[0]
...     print i
... 
[2, 1]
[4, 3]
[6, 5]
>>> pl
[[2, 1], [4, 3], [6, 5]]
>>> 
>>> zpl = [i for sublist in pl for i in sublist]
>>> zpl
[2, 1, 4, 3, 6, 5]
>>> 

我试图以最简单的方式解决。

答案 6 :(得分:0)

It will work for both even and odd elements. if list elements are even 
first part will work if not else will do his task.

a = list(input("Put your list here: "))
len_a = len(a)
last_element = len_a-1

result = 0
if len_a % 2==0:
        for i in range(0, len(a), 2):
                a[i], a[i + 1] = a[i + 1], a[i]
        print("its if",a)

else:
        a_n = a.pop()
        for i in range(0, len(a), 2):
                a[i], a[i + 1] = a[i + 1], a[i]
        a.insert(0,a_n)
        # a.insert(last_element,a_n) if you want last element remain unmodified
        print("its else:",a)