【问题标题】:create specific permutation of a list in python [closed]在python中创建列表的特定排列[关闭]
【发布时间】:2015-06-16 20:51:18
【问题描述】:

我正在尝试编写一个函数,该函数将输入一个列表(具有预定长度)并根据我选择的重新排序输出该列表的排列。

例如,假设我有列表

    [1,'a',12,'b','poppy']

我有排列

    (3,4,5,2,1)

那么函数输出将是一个列表,其中第三个元素在前,第四个元素在后,依此类推

    [12,'b','poppy','a',1]

【问题讨论】:

    标签: python algorithm permutation


    【解决方案1】:
    l = [1,'a',12,'b','poppy']
    
    def p(l,t):
        return [l[i-1] for i in t]
    
    print(p(l,(3,4,5,2,1)))
    [12, 'b', 'poppy', 'a', 1]
    

    索引是基于 0 的,所以如果你真的想为一个 5 元素列表使用索引,它会是 (2,3,4,1,0)[l[i] for i in t]

    【讨论】:

    • 这基本上是带有 -1 的 this。我应该关闭还是不关闭?
    • 这个问题比那个类似的问题写得清楚得多。
    • @DSM,可能是 50/50,OP 实际上可能还打算使用基于零的索引,所以那将是一个完全的欺骗。
    • 谢谢,太好了!
    • @PadraicCunningham:是的,但是输出是一个元组,而不是一个列表。
    【解决方案2】:

    使用operator.itemgetter。由于您的排列是针对基于 1 的列表,因此您需要先在列表的前面添加一个虚拟元素。 (您可以使用多种技术从p 的每个元素中减去一个,但在将列表传递给itemgetter 返回的函数之前将其“移位”更简单。)

    >>> from operator import itemgetter
    >>> p = (3,4,5,2,1)
    >>> lst = [1,'a',12,'b','poppy']
    >>> itemgetter(*p)([None] + lst)
    (12, 'b', 'poppy', 'a', 1)
    

    【讨论】:

    • 我本来要去itemgetter(*map(lambda x: x-1, t))(l),但这更好。
    【解决方案3】:

    列表的第一个元素是0

    l = [1,'a',12,'b','poppy']
    p = (2,3,4,1,0)
    result = []
    for i in p:
        result.append(l[i])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-29
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      相关资源
      最近更新 更多