在Python中切换两个列表的第一个和最后一个元素

时间:2012-01-02 19:34:30

标签: python algorithm

在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 个答案:

答案 0 :(得分: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']

答案 1 :(得分: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']
>>> 

通过OP阅读评论我会采取另一种方法的特权

>>> 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))))

上面没有创建任何临时列表,如果OP希望将其用作迭代器而不是下游处理列表,则可以从函数中安全地删除列表,并可以将其作为元组返回迭代器。