Подтвердить что ты не робот

Как изменить порядок списка?

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

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

4b9b3361

Ответ 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']

Ответ 2

>>> import random
>>> x = [1,2,3,4,5]
>>> random.shuffle(x)
>>> x
[5, 2, 4, 3, 1]

Ответ 3

>>> a = [1, 2, 3]
>>> a[0], a[2] = a[2], a[0]
>>> a
[3, 2, 1]

Ответ 4

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

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

Ответ 5

>>> a=["a","b","c","d","e"]
>>> a[0],a[3] = a[3],a[0]
>>> a
['d', 'b', 'c', 'a', 'e']

Ответ 6

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

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

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

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

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

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

Ответ 7

Из того, что я понимаю из вашего вопроса, кажется, что вы хотите применить перестановку, указанную в 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, но его можно модифицировать тривиально, чтобы переставить оригинал "на месте".

Ответ 8

Если вы используете 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']

Ответ 9

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

a = ['123', 'abc', 456]
order = [2, 0, 1]
a2 = list( np.array(a, dtype=object)[order] )

Ответ 10

newList = [oldList[3]]
newList.extend(oldList[:3])
newList.extend(oldList[4:])

Ответ 11

Еще одна вещь, которая может быть рассмотрена, - это другая интерпретация, обозначенная темным

Код в Python 2.7

В основном:

  • Изменить порядок - уже разрешено AJ выше
  • Изменить порядок по индексу

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

Ответ 12

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

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'

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