我如何重新排列列表?
如果我有一个列表[a,b,c,d,e]
,我怎样才能像[d,c,a,b,e]
这样的任意方式重新排列项目?
编辑:我不想洗牌他们。 我想以预定义的方式对它们进行重新sorting。 (例如,我知道旧列表中的第三个元素应该成为新列表中的第一个元素)
你可以这样做
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']
编辑:meh。 AJ是更快… 我如何重新sorting在Python中的列表?
您可以提供自己的sorting函数list.sort()
:
sort()方法使用可选参数来控制比较。
cmp指定两个参数(列表项)的自定义比较函数,根据第一个参数是小于,等于还是大于第二个参数,它应该返回负数,零或正数:
cmp=lambda x,y: cmp(x.lower(), y.lower())
。 默认值是None
。key指定一个用于从每个列表元素提取比较键的参数的函数:
key=str.lower
。 默认值是None
。reverse是一个布尔值。 如果设置为True,那么列表元素按照每个比较被颠倒的方式sorting。
一般来说,密钥和反向转换过程比指定等效的cmp函数要快得多。 这是因为对于每个列表元素,cmp被多次调用,而按键和反向触摸每个元素只有一次。
>>> a=["a","b","c","d","e"] >>> a[0],a[3] = a[3],a[0] >>> a ['d', 'b', 'c', 'a', 'e']
newList = [oldList[3]] newList.extend(oldList[:3]) newList.extend(oldList[4:])
根据我对您的问题的理解,似乎您想要应用您在list
指定的排列。 这是通过指定另一个list
(让我们称之为p
)来完成的,该list
保存应该出现在置换list
中的原始list
元素的索引。 然后你可以用p
来创build一个新的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']
。
这实际上创build了一个新的list
,但它可以进行简单的修改,以排列原来的“就地”。