如何重新排序列表?[关闭]


107

如果我有列表,[a,b,c,d,e]如何以任意方式重新排序商品[d,c,a,b,e]

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



4
如果没有指定如何您想订购的物品它很难回答。您要对它们排序吗?洗他们吗?删除其中一些?
Mizipzor'2

@tvanfosson:在这种情况下,任意也可能意味着:采用任意(但定义明确)的排序函数。
Felix Kling'2

1
@mizipzor我想以预定义的方式对它们重新排序。(已编辑问题以澄清这一点)
Niyaz 2010年

@SilentGhost它将有一个新索引。可能是4。关键是我知道这些物品的新顺序。
Niyaz

Answers:


226

你可以这样

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

这将创建一个新变量。如何就地重新排序列表?谢谢
混淆了

@Confounded只需将最后一行更改为:mylist[:] = [mylist[i] for i in myorder]
Adam


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

@ wenlibin02,在2.7.5下运行它,仍然可以正常工作。你得到某种错误吗?
2015年

没有错误,我只输入:1)随机导入;x = [1,2,3]; random.shuffle(x); #it​​返回None;和2)我尝试了np.random.shuffle。结果是一样的。
Libin Wen

哦对不起!我没有意识到我直接更改x的值。它确实返回None。而且有效。谢谢。
Libin Wen


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

2

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

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

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

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

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

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


2
以及您将如何实现呢?
SilentGhost 2010年

@SilentGhost:这是一般性回答。在OP中,您的答案更合适。不过,我认为重要的是要知道存在通用解决方案。
Felix Kling'2

2

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

1
OP正在寻找一种特定的重新排序方式,而不是通用的改组方式。
Teepeemm

2

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

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

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

可以考虑的另一件事是“黑暗”指出的另一种解释

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


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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.