2012-01-02 3 views
1

В Python у меня есть два списка, которые имеют одинаковое количество элементов (например, 8 и 8) или одно меньше другого (например, 7 и 8; 3 и 4):Переключить первый и последний элементы из двух списков в Python

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'] 

Какой самый эффективный способ построения алгоритма, который может переключаться элементы списка, как это?

+1

@ Марцин Я думаю, вы хотите http://philosophy.stackexchange.com/ для ответов на этот вопрос; для целей этого вопроса не имеет значения, является ли и/или почему это проблематично. – urschrei

+3

@urschrei, поскольку OP не дает даже очевидного способа кодирования этого как начала, и поскольку OP уже имеет хорошую репутацию, я понимаю, что Марцин задается вопросом, есть ли что-то скрытое в этом вопросе. – joaquin

+0

Извините, я не сделал проблематичность более ясной. Вероятно, мне следовало бы отметить это как Pythonic и объяснил это немного лучше. Проблема в том, что я пытался найти более быстрый и эффективный способ переключения позиций вместо использования временных переменных, таких как ответ joaquin. Я сделал что-то подобное, но был расстроен тем, сколько строк кода он принял. Следовательно, проблема (к сожалению неустановленная) ... :( – Andrew

ответ

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

Вышесказанное не создает никаких временных списка и если OP желает использовать его как итератор, а не список для последующей обработки, тогда список можно безопасно удалить из и может быть возвращен как кортеж итераторов.

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'] 
Смежные вопросы