鱼C论坛

 找回密码
 立即注册
查看: 3698|回复: 14

[已解决]解决列表全排序问题,关键是指出本人思路的问题,再提出解决方法

[复制链接]
发表于 2016-6-13 16:16:53 | 显示全部楼层 |阅读模式
5鱼币
#对列表中的元素进行全排列

def pai(lst):
    '''思路是传入一个列表,判断其中的元素,如果列表长度等于1时返回该列表。如果大于1,
则传出一个元素,然后用递归的想法把传出一个元素后的列表再传出,最后列表中只有一个元素
时,再反回变为一个列表序列,为什么不循环呢?'''
    if len(lst)==1:
        return lst
    else:
        for i in lst:
            lst1=lst[:]#复制一个列表
            lst2=[]
            lst1.remove(i)#移除新列表中元素,减少列表元素,希望最后达到1,达到递归线
            lst2=[i]
            # print (lst2)
            return lst2+pai(lst1)
最佳答案
2016-6-13 16:16:54
本帖最后由 Quit 于 2016-6-16 21:39 编辑

for循环的时候,在进行第一次循环就已经完全给return了,也就是说每层for循环只执行了第一个元素
如果想要排列 [1, 2, 3, 4] ,按照这样的做法
而且返回的东西原本就只是装四个整数的一个list,不可能返回一个全排列的

最佳答案

查看完整内容

for循环的时候,在进行第一次循环就已经完全给return了,也就是说每层for循环只执行了第一个元素 如果想要排列 [1, 2, 3, 4] ,按照这样的做法 而且返回的东西原本就只是装四个整数的一个list,不可能返回一个全排列的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-6-13 16:16:54 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Quit 于 2016-6-16 21:39 编辑

for循环的时候,在进行第一次循环就已经完全给return了,也就是说每层for循环只执行了第一个元素
如果想要排列 [1, 2, 3, 4] ,按照这样的做法
而且返回的东西原本就只是装四个整数的一个list,不可能返回一个全排列的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-6-13 17:33:20 | 显示全部楼层
什么叫列表全排序,举个例子说明一下,给一个列表,预期得到什么样的结果
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-6-13 20:46:23 | 显示全部楼层
应该是用while吧
if else是比較一次
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-6-13 22:13:05 | 显示全部楼层
同意楼上
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-6-14 08:58:37 | 显示全部楼层
if 判断一次就不走了吧  
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-6-14 09:25:51 | 显示全部楼层
挥舞乾坤 发表于 2016-6-13 17:33
什么叫列表全排序,举个例子说明一下,给一个列表,预期得到什么样的结果

就是所有的元素参与组合排序:如给一个参数为列表【1,2,3】;那么通过程序显示出【1,3,2】;【2,1,3】;【2,3,1】;【3,1,2】等
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-6-14 10:40:53 | 显示全部楼层
slzsxyc 发表于 2016-6-14 09:25
就是所有的元素参与组合排序:如给一个参数为列表【1,2,3】;那么通过程序显示出【1,3,2】;【2,1, ...

itertools模块你值得拥有~。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-6-14 11:07:05 | 显示全部楼层
for下面是不在需要一个for循环把列表遍历一下?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-6-14 11:16:32 | 显示全部楼层
slzsxyc 发表于 2016-6-14 09:25
就是所有的元素参与组合排序:如给一个参数为列表【1,2,3】;那么通过程序显示出【1,3,2】;【2,1, ...

itertools模块里有几个排列组合的函数,你可以看一下
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-6-14 13:41:32 | 显示全部楼层
wei_Y 发表于 2016-6-14 10:40
itertools模块你值得拥有~。

我知道这个,但我就想把自己的想法实现一下
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-6-16 11:04:39 | 显示全部楼层
slzsxyc 发表于 2016-6-14 13:41
我知道这个,但我就想把自己的想法实现一下

或许双端队列可以解决
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-6-16 13:25:02 | 显示全部楼层
拿点鱼币真难
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-6-16 21:22:34 | 显示全部楼层
你写的这个实现不了全排列的,传进去lst 返回lst
例如lst=[1,2,3,4]
else:语句最后递归,[1,2,3,4][0]+[2,3,4][0]+[3,4][0]+[4]
实现方式是:
def pai(lst):
    if len(lst)<=1:
        yield lst

    else:
        for each in pai(lst[1:]):
            for i in range(len(lst)):
                yield each[:i]+lst[0:1]+each[i:]

for each in pai([1,2,3,4]):
    print (each)
别问我为什么这么写,网上抄的别人的,我看的头都炸了也没懂!,谁明白的可以告诉我下吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-8-26 09:45:05 | 显示全部楼层
不错哦
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-2-21 08:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表