如果我有一个列表[a,b,c,d,e]
,我如何以[d,c,a,b,e]
之类的任意方式重新排序项目?
编辑:我不想改变它们。我想以预定义的方式重新排序它们。 (例如,我知道旧列表中的第3个元素应该成为新列表中的第一个元素)
答案 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中的代码
主要是:
按索引重新排序
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]
这将打印[&#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'
它只是将列表移动到指定的索引