|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 尼塔玛澈丹 于 2017-4-9 09:29 编辑
各位大佬帮个忙,困扰好几天了,我试着编一个关于全排列的小代码,可是老是显示TypeError: object of type 'NoneType' has no len(),很尴尬。具体报错信息为:
Traceback (most recent call last):
  File "C:\Users\asus\Desktop\Exercise\00000.py", line 19, in <module>
    arrange(member)
  File "C:\Users\asus\Desktop\Exercise\00000.py", line 10, in arrange
    temp_arrange = arrange(temp_list)
  File "C:\Users\asus\Desktop\Exercise\00000.py", line 2, in arrange
    if len(member) == 1:
TypeError: object of type 'NoneType' has no len()
我的思路是这样的:想用递归(或者迭代?)的方式:首先对于输入进的n个元素,转化为字符类型存放于列表中,在取出第一个字符类型作为插入元素,依次插入到前面n-1个已经做好全排列的结果中,最后以列表形式输出。预计的结果大概像这样:[['a','s','d'],['a','d','s'],['d','s','a'],['d','a','s']]
下面贴的是我的代码:
def arrange(member):
    if len(member) == 1:
        result = []
        result.append(member)
        print(result)
        
    else:
        x = member[0]
        temp_list = member.remove(x)
        temp_arrange = arrange(temp_list)
        for i in temp_arrange:
            for j in range(len(i)):
                i.insert(j,x)
                print(i)
   
member = input("请输入待排列元素:")
member = list(member)
arrange(member)
- 第一种方法:递归
- def perms(elements):
- if len(elements) <=1:
- yield elements
- else:
- for perm in perms(elements[1:]):
- for i in range(len(elements)):
- yield perm[:i] + elements[0:1] + perm[i:]
-
- for item in list(perms([1, 2, 3,4])):
- print item
- [1, 2, 3, 4]
- [2, 1, 3, 4]
- [2, 3, 1, 4]
- [2, 3, 4, 1]
- [1, 3, 2, 4]
- [3, 1, 2, 4]
- [3, 2, 1, 4]
- [3, 2, 4, 1]
- [1, 3, 4, 2]
- [3, 1, 4, 2]
- [3, 4, 1, 2]
- [3, 4, 2, 1]
- [1, 2, 4, 3]
- [2, 1, 4, 3]
- [2, 4, 1, 3]
- [2, 4, 3, 1]
- [1, 4, 2, 3]
- [4, 1, 2, 3]
- [4, 2, 1, 3]
- [4, 2, 3, 1]
- [1, 4, 3, 2]
- [4, 1, 3, 2]
- [4, 3, 1, 2]
- [4, 3, 2, 1]
-
- 第二种方法:python标准库
- 有1,2,3,4这4个数字,能组成多少个互不相同且无重复数字的三位数。
-
- import itertools
- print list(itertools.permutations([1, 2, 3,4],3))
-
-
- 源代码如下:
- #coding:utf-8
- """
- 迪艾姆python培训 黄哥改写
-
- """
- import itertools
- print list(itertools.permutations([1, 2, 3,4],3))
-
- def perms(elements):
- if len(elements) <=1:
- yield elements
- else:
- for perm in perms(elements[1:]):
- for i in range(len(elements)):
- yield perm[:i] + elements[0:1] + perm[i:]
-
- for item in list(perms([1, 2, 3,4])):
- print item
-
-
- 第三种:看看官方文档上写的代码
- def permutations(iterable, r=None):
- # permutations('ABCD', 2) --> AB AC AD BA BC BD CA CB CD DA DB DC
- # permutations(range(3)) --> 012 021 102 120 201 210
- pool = tuple(iterable)
- n = len(pool)
- r = n if r is None else r
- if r > n:
- return
- indices = range(n)
- cycles = range(n, n-r, -1)
- yield tuple(pool[i] for i in indices[:r])
- while n:
- for i in reversed(range(r)):
- cycles[i] -= 1
- if cycles[i] == 0:
- indices[i:] = indices[i+1:] + indices[i:i+1]
- cycles[i] = n - i
- else:
- j = cycles[i]
- indices[i], indices[-j] = indices[-j], indices[i]
- yield tuple(pool[i] for i in indices[:r])
- break
- else:
- return
-
- for item in list(permutations([1, 2, 3,4],3)):
- print item
-
- 第四种 递归求m个list中,n个
-
- def perm(items, n=None):
- if n is None:
- n = len(items)
- for i in range(len(items)):
- v = items[i:i+1]
- if n == 1:
- yield v
- else:
- rest = items[:i] + items[i+1:]
- for p in perm(rest, n-1):
- yield v + p
复制代码
建议百度
|
|