Ответ 1
Вы можете сделать это так
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']
Если у меня есть список [a,b,c,d,e]
, как я могу изменить порядок элементов произвольным образом, например [d,c,a,b,e]
?
Изменить: я не хочу перетасовывать их. Я хочу переопределить их в предопределенной манере. (например, я знаю, что третий элемент в старом списке должен стать первым элементом в новом списке)
Вы можете сделать это так
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']
>>> import random
>>> x = [1,2,3,4,5]
>>> random.shuffle(x)
>>> x
[5, 2, 4, 3, 1]
>>> a = [1, 2, 3]
>>> a[0], a[2] = a[2], a[0]
>>> a
[3, 2, 1]
Является ли окончательный порядок, определяемый списком индексов?
>>> 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']
Изменить: meh. AJ был быстрее... Как изменить порядок в python?
>>> a=["a","b","c","d","e"]
>>> a[0],a[3] = a[3],a[0]
>>> a
['d', 'b', 'c', 'a', 'e']
Вы можете предоставить свою собственную функцию сортировки list.sort()
:
Метод sort() принимает необязательные аргументы для контроля сравнений.
cmp задает функцию пользовательского сопоставления двух аргументов (элементов списка), которые должны возвращать отрицательное, нулевое или положительное число в зависимости от того, считается ли первый аргумент меньшим, равным или большим, чем второй аргумент:
Клавишаcmp=lambda x,y: cmp(x.lower(), y.lower())
. Значение по умолчанию:None
.указывает функцию одного аргумента, которая используется для извлечения ключа сравнения из каждого элемента списка:
key=str.lower
. Значение по умолчанию:None
.reverse - это логическое значение. Если установлено значение "Истина", элементы списка сортируются так, как если бы каждое сравнение было отменено.
В общем, процессы преобразования ключей и обратного преобразования намного быстрее, чем указание эквивалентной функции cmp. Это связано с тем, что cmp вызывается несколько раз для каждого элемента списка, а ключ и обратное касаются каждого элемента только один раз.
Из того, что я понимаю из вашего вопроса, кажется, что вы хотите применить перестановку, указанную в 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
, но его можно модифицировать тривиально, чтобы переставить оригинал "на месте".
Если вы используете 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']
Если вам не так важна эффективность, вы можете полагаться на индексирование массива, чтобы сделать его элегантным:
a = ['123', 'abc', 456]
order = [2, 0, 1]
a2 = list( np.array(a, dtype=object)[order] )
newList = [oldList[3]]
newList.extend(oldList[:3])
newList.extend(oldList[4:])
Еще одна вещь, которая может быть рассмотрена, - это другая интерпретация, обозначенная темным
Код в Python 2.7
В основном:
Изменить порядок по индексу
mylist = ['a', 'b', 'c', 'd', 'e']
myorder = [3, 2, 0, 1, 4]
mylist = sorted(zip(mylist, myorder), key=lambda x: x[1])
print [item[0] for item in mylist]
Это напечатает ['c', 'd', 'b', 'a', 'e']
Это то, что я использовал, когда наткнулся на эту проблему.
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'
Он просто сдвигает список к указанному индексу