Python 如何重新排列列表?
如果我有一个列表Python 如何重新排列列表?,python,Python,如果我有一个列表[a,b,c,d,e]我怎么能像[d,c,a,b,e]那样以任意方式对项目重新排序 编辑:我不想洗牌。我想以预先确定的方式重新订购。(例如,我知道旧列表中的第三个元素应该成为新列表中的第一个元素)您可以这样做 mylist = ['a', 'b', 'c', 'd', 'e'] myorder = [3, 2, 0, 1, 4] mylist = [mylist[i] for i in myorder] print(mylist) # prints: ['d',
[a,b,c,d,e]
我怎么能像[d,c,a,b,e]
那样以任意方式对项目重新排序
编辑:我不想洗牌。我想以预先确定的方式重新订购。(例如,我知道旧列表中的第三个元素应该成为新列表中的第一个元素)您可以这样做
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']
最终顺序是否由索引列表定义
>>> 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']
>items=[1,无,“鸡”,int]
>>>顺序=[3,0,1,2]
>>>有序_列表=[i中的项目[i]
>>>有序列表
[,1,无,'鸡']
编辑:meh。AJ跑得更快 您可以提供自己的排序功能: sort()方法采用可选参数来控制比较
- cmp指定两个参数(列表项)的自定义比较函数,根据第一个参数是否被视为小于、等于或大于第二个参数,该函数应返回负数、零数或正数:
。默认值为cmp=lambda x,y:cmp(x.lower(),y.lower())
None
- key指定一个参数的函数,用于从每个列表元素中提取比较键:
。默认值为key=str.lower
None
- 反向是一个布尔值。如果设置为True,则列表元素将被排序,就像每个比较都被反转一样
根据我对您问题的理解,您似乎希望应用您在
列表中指定的排列。这是通过指定另一个列表
(我们称之为p
)来实现的,该列表保存了原始列表
中应出现在已排列列表
中的元素的索引。然后使用p
创建一个新的列表
,只需将每个位置的元素替换为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']
这实际上创建了一个新的列表
,但可以对其进行简单的修改,以替换原始的“就地”。可以考虑的另一件事是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'
它只是简单地将列表移动到指定的索引,如果使用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']
如果您不太在意效率,可以依靠numpy的数组索引使其变得优雅:
a = ['123', 'abc', 456]
order = [2, 0, 1]
a2 = list( np.array(a, dtype=object)[order] )
可能是重复的,但不指定如何订购,这很难回答。你想把它们分类吗?洗牌?删除其中一些?@tvanfosson:在本例中,“任意”也可能意味着:使用任意(但定义良好)排序函数。@mizipzor我想以预定义的方式对它们重新排序。(编辑问题以澄清这一点)@silenghost它将有一个新的索引。5月4日。关键是我知道这些物品的新顺序。你将如何准确地实现这一点?@SilentGhost:这是一个一般性的回答。在老年退休金计划的情况下,你的答案更合适。尽管如此,我认为知道一个通用解决方案的存在是很重要的。@wenlibin02,刚刚在2.7.5下运行过,它仍然可以正常工作。你有什么错误吗?没有错误,我只是键入:1)导入随机;x=[1,2,3];随机。洗牌(x)#它不返回任何值;我尝试了np.random.shuffle。结果是一样的。哦,对不起!我没有意识到我直接改变了x的值。它没有返回任何结果。它是有效的。Thank.OP正在寻找一个特定的重新排序,而不是一般的洗牌。这将创建一个新变量。如何在适当的位置重新排序列表?Thanks@Confounded只需将最后一行更改为:mylist[:]=[mylist[i]for i in myorder]
@Adam谢谢!这个操作的时间和空间复杂度是多少?当将[mylist[i]for i in myorder]
中的条目分配给mylist[:]
时,它是否会迭代mylist
?嘿,我是Python新手,我很好奇这行代码“[mylist[i]for i in myorder]”是如何工作的?我只学了基本的for loop。哇,老掉牙但很不错。谢谢你带我回去。检查列表理解:我只是无法理解语法,直到我意识到这是一个错误。´:-)
order(string.ascii_lowercase, 'h'):
>>> 'hijklmnopqrstuvwxyzabcdefg'
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']
a = ['123', 'abc', 456]
order = [2, 0, 1]
a2 = list( np.array(a, dtype=object)[order] )