Поменять позицию двух элементов массива в Python

Есть ли простой способ поменять местами 2 элемента или, что еще лучше, n элементов в массиве?

Я придумал некоторый код, но он выглядит довольно уродливо, и производительность должна быть немного плохой:

chromo = [[1,2], [3,4], [5,6]]

gene1Pos = random.randrange(0, len(chromo)-1, 1)
gene2Pos = random.randrange(0, len(chromo)-1, 1)
tmpGene1 = chromo[gene1Pos]
tmpGene2 = chromo[gene2Pos]
chromo[gene1Pos] = tmpGene2
chromo[gene2Pos] = tmpGene1

Это должно сработать, но это нехорошо. Лучшим способом была бы процедура, такая как random.shuffle, но вместо того, чтобы смешивать все, смешивалось бы только число n элементов. Есть ли у вас какие-либо идеи?


person jbssm    schedule 31.12.2011    source источник


Ответы (3)


пытаться

>>> chromo[gene1Pos], chromo[gene2Pos] = chromo[gene2Pos], chromo[gene1Pos]

Так что вам просто нужно убедиться, что у вас есть правильный genXPos

person louis.luo    schedule 31.12.2011
comment
См. stackoverflow.com /questions/4554130/ для обсуждения того, во что он компилируется и почему он самый быстрый. - person dkamins; 31.12.2011
comment
Спасибо. Это немного красивее и, как указывает dkamins, быстрее. - person jbssm; 31.12.2011

Просто объедините обычный механизм обмена переменными в Python с назначением нарезки/нарезки.

>>> a = [1, 2, 3, 4, 5]
>>> a[2:3], a[4:5] = a[4:5], a[2:3]
>>> a
[1, 2, 5, 4, 3]
person Ignacio Vazquez-Abrams    schedule 31.12.2011

Нет ничего плохого в том, что ты делаешь. Однако вы можете упростить его, удалив одну из временных переменных. Чтобы поменять местами a и b, все, что вам нужно, это:

tmp = a
a = b
b = tmp
person dkamins    schedule 31.12.2011
comment
Нет нет нет! Это не Python, о котором вы подумали! В Python распаковка кортежа и назначение кортежа позволяет вам написать: a,b = b,a Готово! - person PaulMcG; 31.12.2011
comment
@PaulMcGuire Согласен. Смотрите мой комментарий к вашему ответу (за который я проголосовал) о производительности (a,b=b,a самый быстрый). Но подкачка через temp есть и всегда будет классическим микроалгоритмом, который должен быть в наборе инструментов любого программиста. - person dkamins; 31.12.2011