在Python中交换两个列表的首尾元素
在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))))
上面的做法不会创建任何临时列表。如果提问者希望将其用作迭代器,而不是列表来进行后续处理,那么可以安全地去掉列表的部分,直接返回一个迭代器的元组。