Как я могу изменить порядок списка?
Если у меня есть список [a,b,c,d,e]
Как я могу изменить порядок пунктов в произвольном порядке как [d,c,a,b,e]
?
редактировать: я не хочу, чтобы перетасовать их. Я хочу переупорядочить их заранее определенным образом. (например, я знаю, что 3-й элемент в списке должен стать первым элементом в новом списке)
11 ответов:
вы можете сделать это
mylist=['a','b','c','d','e'] myorder=[3,2,0,1,4] mylist = [ mylist[i] for i in myorder] print mylist
определяется ли окончательный порядок списком индексов ?
>>> 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 вызывается несколько раз для каждого элемента списка, а клавиша и обратная связь касаются каждого элемента только один раз.
из того, что я понимаю из вашего вопроса, похоже, что вы хотите применить перестановку, которую вы указываете на
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']
еще одна вещь, которую можно рассмотреть, - это другая интерпретация, указанная darkless
код в 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']
это то, что я использовал, когда я наткнулся на эту проблему.
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'
Он просто просто сдвигает список в указанный индекс