如何重新排序列表?

时间:2010-02-01 15:08:33

标签: python

如果我有一个列表[a,b,c,d,e],我如何以[d,c,a,b,e]之类的任意方式重新排序项目?

编辑:我不想改变它们。我想以预定义的方式重新排序它们。 (例如,我知道旧列表中的第3个元素应该成为新列表中的第一个元素)

12 个答案:

答案 0 :(得分:190)

你可以这样做

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

答案 1 :(得分:11)

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

答案 2 :(得分:10)

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

答案 3 :(得分:6)

最终订单是否由指数列表定义?

>>> 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更快...... How can I reorder a list in python?

答案 4 :(得分:3)

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

答案 5 :(得分:2)

您可以为list.sort()提供自己的排序功能:

  

sort()方法采用可选参数来控制比较。

     
      
  • cmp 指定两个参数(列表项)的自定义比较函数,它应返回负数,零或正数,具体取决于第一个参数是否被认为小于,等于,或大于第二个参数:cmp=lambda x,y: cmp(x.lower(), y.lower())。默认值为None

  •   
  • key 指定一个参数的函数,该函数用于从每个列表元素中提取比较键:key=str.lower。默认值为None

  •   
  • reverse 是一个布尔值。如果设置为True,则对列表元素进行排序,就好像每个比较都已反转一样。

  •   
     

通常,键和反向转换过程比指定等效的cmp函数快得多。这是因为对于每个列表元素多次调用cmp,而键和反向触摸每个元素只有一次。

答案 6 :(得分:1)

根据我对您的问题的理解,您似乎希望应用您在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

这实际上创建了一个新的{{1}},但它可以通过简单的修改来置换原来的“就地”。

答案 7 :(得分:1)

如果使用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']

答案 8 :(得分:1)

如果您不太在乎效率,则可以依靠numpy的数组索引使其美观:

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

答案 9 :(得分:0)

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

答案 10 :(得分:0)

可以考虑的另一件事是无暗的

指出的另一种解释

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]
    
  3. 这将打印[&#39; c&#39;,&#39; d&#39;&#39; b&#39;,&#39; a&#39;&#39; e&#39 ]

答案 11 :(得分:-1)

这是我偶然发现这个问题时使用的。

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'

它只是将列表移动到指定的索引