【问题标题】:How to append the first item of list to the end of all permutations of that list?如何将列表的第一项附加到该列表的所有排列的末尾?
【发布时间】:2015-04-23 11:59:54
【问题描述】:

如果我有一个包含五个项目的列表,并且我想获得该列表的每个排列,如何保持第一个和最后一个项目相同?

就像这样,包含五个项目的列表将产生一个列表的 120 个排列,其中该列表中将有六个项目,但第一个和最后一个项目将是相同的。以下是我到目前为止所做的。任何帮助将不胜感激。

from itertools import permutations
airportlist = ["airport1", "airport2", "airport3", "airport4", "airport5"]

permlist = permutations(airportlist, 5)
print(permlist)
print(list(permlist))

for i in list(permlist):

    newlist = (list(i))

    print(newlist)# getting e.g. ['airport1', 'airport5', 'airport2', 'airport4', 'airport3']

    print(list(i)[0]) # getting (to continue above example) airport1
    newerlist = (list(i).append((list(i)[0])))

    print(newerlist)#getting None but want ['airport1', 'airport5', 'airport2', 'airport4', 'airport3', 'airport1']

这可能吗?

【问题讨论】:

    标签: python algorithm list


    【解决方案1】:

    如果我没听错的话,您希望第一个和最后一个机场与原始列表保持一致,并生成其间元素的排列。在这种情况下,您可以执行以下操作,其中仅生成中间元素的排列:

    >>> from itertools import permutations
    >>> airports = ["airport1", "airport2", "airport3", "airport4", "airport5"]
    >>> [airports[:1] + list(x) + airports[-1:] for x in permutations(airports[1:-1])]
    [['airport1', 'airport2', 'airport3', 'airport4', 'airport5'], ['airport1', 'airport2', 'airport4', 'airport3', 'airport5'], ['airport1', 'airport3', 'airport2', 'airport4', 'airport5'], ['airport1', 'airport3', 'airport4', 'airport2', 'airport5'], ['airport1', 'airport4', 'airport2', 'airport3', 'airport5'], ['airport1', 'airport4', 'airport3', 'airport2', 'airport5']]
    

    编辑

    重新阅读您的问题,我认为您可能想要创建排列,其中起始机场和结束机场相同,并且中间的值得到排列,这非常简单:

    >>> combos = [list(x) + [x[0]] for x in permutations(airports)]
    >>> for x in combos: print x
    ['airport1', 'airport2', 'airport3', 'airport4', 'airport5', 'airport1']
    ['airport1', 'airport2', 'airport3', 'airport5', 'airport4', 'airport1']
    ... 
    ... 
    ['airport5', 'airport4', 'airport3', 'airport1', 'airport2', 'airport5']
    ['airport5', 'airport4', 'airport3', 'airport2', 'airport1', 'airport5']
    

    【讨论】:

    • 感谢您的快速回复!这很好,但不是我想要的。
    • 我想要例如['airport1', 'airport3', 'airport2', 'airport4', 'airport5'],['airport2', 'airport3', 'airport1', 'airport4', 'airport5']...#所有 120 个排列] 变为:['airport1', 'airport3', 'airport2', 'airport4', 'airport5', 'airport1'], ['airport2', 'airport3', 'airport1', 'airport4', 'airport5' , 'airport2'] 即仍然排列所有列表,但每次都将第一项添加到列表的末尾。这有意义吗?
    • @GavinMcCoy 酷,别忘了点赞并接受 :)
    【解决方案2】:

    只是,好吧,将每个列表的第一项附加到每个列表。

    from itertools import permutations
    airportlist = ["airport1", "airport2", "airport3"]
    
    perms = permutations (airportlist)
    newperms = [list (x) + [x[0]] for x in perms]
    
    for element in list (newperms):
        print element
    

    结果是:

    ['airport1', 'airport2', 'airport3', 'airport1']
    ['airport1', 'airport3', 'airport2', 'airport1']
    ['airport2', 'airport1', 'airport3', 'airport2']
    ['airport2', 'airport3', 'airport1', 'airport2']
    ['airport3', 'airport1', 'airport2', 'airport3']
    ['airport3', 'airport2', 'airport1', 'airport3']
    

    【讨论】:

      【解决方案3】:

      我猜你想要的是:

      [airportlist[:1] + list(i) + airportlist[:1] for i in permutations(airportlist[1:])]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-27
        • 1970-01-01
        相关资源
        最近更新 更多