Как я могу изменить порядок списка? - PullRequest
86 голосов
/ 01 февраля 2010

Если у меня есть список [a,b,c,d,e], как я могу изменить порядок элементов в произвольном порядке, например [d,c,a,b,e]?

Редактировать: я не хочу их тасовать. Я хочу переупорядочить их заранее определенным образом. (например, я знаю, что третий элемент в старом списке должен стать первым элементом в новом списке)

Ответы [ 12 ]

195 голосов
/ 01 февраля 2010

Вы можете сделать это так

mylist = ['a', 'b', 'c', 'd', 'e']
myorder = [3, 2, 0, 1, 4]
mylist = [mylist[i] for i in myorder]
print(mylist)         # prints: ['d', 'c', 'a', 'b', 'e']
11 голосов
/ 01 февраля 2010
>>> import random
>>> x = [1,2,3,4,5]
>>> random.shuffle(x)
>>> x
[5, 2, 4, 3, 1]
10 голосов
/ 01 февраля 2010
>>> a = [1, 2, 3]
>>> a[0], a[2] = a[2], a[0]
>>> a
[3, 2, 1]
6 голосов
/ 01 февраля 2010

Окончательный порядок определяется списком индексов?

>>> items = [1, None, "chicken", int]
>>> order = [3, 0, 1, 2]

>>> ordered_list = [items[i] for i in order]
>>> ordered_list
[<type 'int'>, 1, None, 'chicken']

редактировать: ме. AJ был быстрее ... Как я могу изменить порядок списка в Python?

3 голосов
/ 01 февраля 2010
>>> a=["a","b","c","d","e"]
>>> a[0],a[3] = a[3],a[0]
>>> a
['d', 'b', 'c', 'a', 'e']
2 голосов
/ 01 февраля 2010

Вы можете предоставить собственную функцию сортировки для list.sort():

Метод sort () принимает необязательные аргументы для управления сравнениями.

  • cmp определяет пользовательскую функцию сравнения двух аргументов (элементов списка), которая должна возвращать отрицательное, нулевое или положительное число в зависимости от того, считается ли первый аргумент меньше, равен или больше второго аргумента: cmp=lambda x,y: cmp(x.lower(), y.lower()). Значением по умолчанию является None.

  • ключ указывает функцию одного аргумента, которая используется для извлечения ключа сравнения из каждого элемента списка: key=str.lower. Значением по умолчанию является None.

  • реверс - логическое значение. Если установлено значение True, то элементы списка сортируются так, как если бы каждое сравнение было обратным.

Обычно процессы преобразования ключей и обратного преобразования выполняются намного быстрее, чем указание эквивалентной функции cmp. Это связано с тем, что cmp вызывается несколько раз для каждого элемента списка, а нажатие клавиши и обратное касание каждого элемента - только один раз.

1 голос
/ 02 ноября 2018

Если вас не очень заботит эффективность, вы можете положиться на индексирование массива numpy, чтобы сделать его элегантным:

a = ['123', 'abc', 456]
order = [2, 0, 1]
a2 = list( np.array(a, dtype=object)[order] )
1 голос
/ 18 июля 2018

Если вы используете numpy, есть отличный способ сделать это:

items = np.array(["a","b","c","d"])
indices = np.arange(items.shape[0])
np.random.shuffle(indices)
print(indices)
print(items[indices])

Этот код возвращает:

[1 3 2 0]
['b' 'd' 'c' 'a']
1 голос
/ 02 февраля 2010

Из того, что я понимаю по вашему вопросу, видно, что вы хотите применить перестановку, указанную вами для list. Это делается путем указания другого list (назовем его p), который содержит индексы элементов исходного list, которые должны появиться в переставленном list. Затем вы используете p для создания нового list, просто заменяя элемент в каждой позиции тем, чей индекс находится в этой позиции в p.

def apply_permutation(lst, p):
    return [lst[x] for x in p]

arr=list("abcde")
new_order=[3,2,0,1,4]

print apply_permutation(arr,new_order)

Это печатает ['d', 'c', 'a', 'b', 'e'].

Это фактически создает новый list, но его можно тривиально изменить, чтобы переставить оригинал "на месте".

0 голосов
/ 16 апреля 2018

Это то, что я использовал, когда наткнулся на эту проблему.

def order(list_item, i): # reorder at index i
    order_at = list_item.index(i)
    ordered_list = list_item[order_at:] + list_item[:order_at]
    return ordered_list

EX: для строчных букв

order(string.ascii_lowercase, 'h'):
>>> 'hijklmnopqrstuvwxyzabcdefg'

Просто сдвигает список к указанному индексу

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...