我想在python中编写一个小代码,在列表中交换元素,这个程序将接受一个列表,并返回一个列表,用于交换每对相邻元素的位置:位置0和1,位置2和3 , 等等。如果列表具有奇数个元素,则最后位置的元素保持“就位”。
Before: [1,2,3,4,5]
After: [2,1,4,3,5]
这看起来很单调。 Python的方法是什么?
答案 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)