在Python中交换两个列表的首尾元素

1 投票
2 回答
787 浏览
提问于 2025-04-17 09:24

在Python中,我有两个列表,它们的元素数量要么相等(比如8个和8个),要么一个比另一个少一个(比如7个和8个;3个和4个):

list1 = ['A', 'B', 'C', 'D']
list2 = ['E', 'F', 'G', 'H']

或者

list3 = ['A', 'B', 'C']
list4 = ['D', 'E', 'F', 'G']

我想找出一个好的方法,来编写一个算法,把第一个列表的后半部分和第二个列表的前半部分交换。这样做的结果是,当两个列表的元素数量都是偶数时,结果会是这样的:

switched_list1 = ['A', 'B', 'E', 'F']
switched_list2 = ['C', 'D', 'G', 'H']

……而当其中一个列表的元素数量是奇数时,结果会是这样的:

switched_list3 = ['A', 'D', 'E']
switched_list4 = ['B', 'C', 'F', 'G']

那么,有什么高效的方法可以实现这样的列表元素交换呢?

2 个回答

3
list1 = ['A', 'B', 'C']
list2 = ['D', 'E', 'F', 'G']

nlist1 = len(list1)/2
nlist2 = len(list2)/2

new1 = list1[:nlist1] + list2[:nlist2]
new2 = list1[nlist1:] + list2[nlist2:]

print new1
print new2
['A', 'D', 'E']
['B', 'C', 'F', 'G']

生成

2
>>> def StrangeSwitch(list1,list2):
    return (list1[:len(list1)/2]+list2[:len(list2)/2],list1[len(list1)/2:]+list2[len(list2)/2:])

>>> list1 = ['A', 'B', 'C', 'D']
>>> list2 = ['E', 'F', 'G', 'H']
>>> (list1,list2)=StrangeSwitch(list1,list2)
>>> list1
['A', 'B', 'E', 'F']
>>> list2
['C', 'D', 'G', 'H']
>>> list3 = ['A', 'B', 'C']
>>> list4 = ['D', 'E', 'F', 'G']
>>> (list3,list4)=StrangeSwitch(list3,list4)
>>> list3
['A', 'B', 'C']
>>> list4
['B', 'C', 'F', 'G']
>>> 

根据提问者的评论,我想提出另一种方法。

>>> def StrangeSwitchFast(list1,list2):
    #return (list1[:len(list1)/2]+list2[:len(list2)/2],list1[len(list1)/2:]+list2[len(list2)/2:])
    return (list(itertools.chain(itertools.islice(list1,0,len(list1)/2),itertools.islice(list2,0,len(list2)/2))),
        list(itertools.chain(itertools.islice(list1,len(list1)/2,None),itertools.islice(list2,len(list2)/2,None))))

上面的做法不会创建任何临时列表。如果提问者希望将其用作迭代器,而不是列表来进行后续处理,那么可以安全地去掉列表的部分,直接返回一个迭代器的元组。

撰写回答