Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何重新排列列表?_Python - Fatal编程技术网

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,则列表元素将被排序,就像每个比较都被反转一样

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


根据我对您问题的理解,您似乎希望应用您在
列表中指定的排列。这是通过指定另一个
列表
(我们称之为
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] )