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


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

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

11 70

11 ответов:

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

mylist=['a','b','c','d','e']
myorder=[3,2,0,1,4]
mylist = [ mylist[i] for i in myorder]
print mylist
>>> 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']

edit: meh. Эй-Джей был быстрее... как я могу изменить порядок списка в python?

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

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

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

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

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

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

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

из того, что я понимаю из вашего вопроса, похоже, что вы хотите применить перестановку, которую вы указываете на 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']
newList = [oldList[3]]
newList.extend(oldList[:3])
newList.extend(oldList[4:])

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

код в Python 2.7

главным образом:

  1. изменить порядок по значению-уже решено AJ выше
  2. изменить порядок по индексу

    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

пример: для строчных букв

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

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