鱼C论坛

 找回密码
 立即注册
查看: 5991|回复: 6

[已解决]TypeError: object of type 'NoneType' has no len()

[复制链接]
发表于 2017-4-9 09:19:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 尼塔玛澈丹 于 2017-4-9 09:29 编辑

各位大佬帮个忙,困扰好几天了,我试着编一个关于全排列的小代码,可是老是显示TypeError: object of type 'NoneType' has no len(),很尴尬。具体报错信息为:
Traceback (most recent call last):
&#160;&#160;File "C:\Users\asus\Desktop\Exercise\00000.py", line 19, in <module>
&#160; &#160; arrange(member)
&#160;&#160;File "C:\Users\asus\Desktop\Exercise\00000.py", line 10, in arrange
&#160; &#160; temp_arrange = arrange(temp_list)
&#160;&#160;File "C:\Users\asus\Desktop\Exercise\00000.py", line 2, in arrange
&#160; &#160; 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):
&#160; &#160; if len(member) == 1:
&#160; &#160;&#160; &#160;&#160;&#160;result = []
&#160; &#160;&#160; &#160;&#160;&#160;result.append(member)
&#160; &#160;&#160; &#160;&#160;&#160;print(result)
&#160; &#160;&#160; &#160;&#160;&#160;
&#160; &#160; else:
&#160; &#160;&#160; &#160;&#160;&#160;x = member[0]
&#160; &#160;&#160; &#160;&#160;&#160;temp_list = member.remove(x)
&#160; &#160;&#160; &#160;&#160;&#160;temp_arrange = arrange(temp_list)
&#160; &#160;&#160; &#160;&#160;&#160;for i in temp_arrange:
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;for j in range(len(i)):
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; i.insert(j,x)
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160; print(i)
&#160; &#160;

member = input("请输入待排列元素:")
member = list(member)
arrange(member)
最佳答案
2017-4-9 09:32:53
  1. 第一种方法:递归
  2. def perms(elements):
  3.     if len(elements) <=1:
  4.         yield elements
  5.     else:
  6.         for perm in perms(elements[1:]):
  7.             for i in range(len(elements)):
  8.                 yield perm[:i] + elements[0:1] + perm[i:]

  9. for item in list(perms([1, 2, 3,4])):
  10.     print item
  11. [1, 2, 3, 4]
  12. [2, 1, 3, 4]
  13. [2, 3, 1, 4]
  14. [2, 3, 4, 1]
  15. [1, 3, 2, 4]
  16. [3, 1, 2, 4]
  17. [3, 2, 1, 4]
  18. [3, 2, 4, 1]
  19. [1, 3, 4, 2]
  20. [3, 1, 4, 2]
  21. [3, 4, 1, 2]
  22. [3, 4, 2, 1]
  23. [1, 2, 4, 3]
  24. [2, 1, 4, 3]
  25. [2, 4, 1, 3]
  26. [2, 4, 3, 1]
  27. [1, 4, 2, 3]
  28. [4, 1, 2, 3]
  29. [4, 2, 1, 3]
  30. [4, 2, 3, 1]
  31. [1, 4, 3, 2]
  32. [4, 1, 3, 2]
  33. [4, 3, 1, 2]
  34. [4, 3, 2, 1]

  35. 第二种方法:python标准库
  36. 有1,2,3,4这4个数字,能组成多少个互不相同且无重复数字的三位数。

  37. import itertools
  38. print list(itertools.permutations([1, 2, 3,4],3))


  39. 源代码如下:
  40. #coding:utf-8
  41. """
  42. 迪艾姆python培训 黄哥改写

  43. """
  44. import itertools
  45. print list(itertools.permutations([1, 2, 3,4],3))

  46. def perms(elements):
  47.     if len(elements) <=1:
  48.         yield elements
  49.     else:
  50.         for perm in perms(elements[1:]):
  51.             for i in range(len(elements)):
  52.                 yield perm[:i] + elements[0:1] + perm[i:]

  53. for item in list(perms([1, 2, 3,4])):
  54.     print item


  55. 第三种:看看官方文档上写的代码
  56. def permutations(iterable, r=None):
  57.     # permutations('ABCD', 2) --> AB AC AD BA BC BD CA CB CD DA DB DC
  58.     # permutations(range(3)) --> 012 021 102 120 201 210
  59.     pool = tuple(iterable)
  60.     n = len(pool)
  61.     r = n if r is None else r
  62.     if r > n:
  63.         return
  64.     indices = range(n)
  65.     cycles = range(n, n-r, -1)
  66.     yield tuple(pool[i] for i in indices[:r])
  67.     while n:
  68.         for i in reversed(range(r)):
  69.             cycles[i] -= 1
  70.             if cycles[i] == 0:
  71.                 indices[i:] = indices[i+1:] + indices[i:i+1]
  72.                 cycles[i] = n - i
  73.             else:
  74.                 j = cycles[i]
  75.                 indices[i], indices[-j] = indices[-j], indices[i]
  76.                 yield tuple(pool[i] for i in indices[:r])
  77.                 break
  78.         else:
  79.             return

  80. for item in list(permutations([1, 2, 3,4],3)):
  81.     print item

  82. 第四种 递归求m个list中,n个

  83. def perm(items, n=None):
  84.     if n is None:
  85.         n = len(items)
  86.     for i in range(len(items)):
  87.         v = items[i:i+1]
  88.         if n == 1:              
  89.             yield v
  90.         else:
  91.             rest = items[:i] + items[i+1:]
  92.             for p in perm(rest, n-1):     
  93.                 yield v + p
复制代码

建议百度
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-4-9 09:21:38 From FishC Mobile | 显示全部楼层
你要写入return
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-9 09:26:27 | 显示全部楼层

我在if 和else两段下面都加了return语句,还是不行,报错信息还是一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-9 09:30:47 | 显示全部楼层
  1. def conti(s):
  2.     for i in range(len(s)-1):
  3.         if (s[i]!=s[i+1]+1):
  4.             return 1
  5.     return 0
  6. def a(list):
  7.     s=[]
  8.     for i in range(len(list)):
  9.         s.append(i)
  10.     while (conti(s)):
  11.         i=len(s)-1
  12.         while (s[i]<s[i-1]):
  13.             i=i-1
  14.         k=i
  15.         for j in range(i+1,len(s)):
  16.             if (s[j]>s[i-1])and(s[j]<s[k]):
  17.                 k=j
  18.         t=s[i-1]
  19.         s[i-1]=s[k]
  20.         s[k]=t
  21.         for j in range(i,int((len(s)-1+i)/2)+1):
  22.             t=s[j]
  23.             s[j]=s[len(s)-1-j+i]
  24.             s[len(s)-1-j+i]=t
  25.         list=list+' '
  26.         for i in range(len(s)):
  27.             list=list+list[s[i]]
  28.     print(list)
  29. list="123"
  30. a(list)
复制代码

建议你百度
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-9 09:32:53 | 显示全部楼层    本楼为最佳答案   
  1. 第一种方法:递归
  2. def perms(elements):
  3.     if len(elements) <=1:
  4.         yield elements
  5.     else:
  6.         for perm in perms(elements[1:]):
  7.             for i in range(len(elements)):
  8.                 yield perm[:i] + elements[0:1] + perm[i:]

  9. for item in list(perms([1, 2, 3,4])):
  10.     print item
  11. [1, 2, 3, 4]
  12. [2, 1, 3, 4]
  13. [2, 3, 1, 4]
  14. [2, 3, 4, 1]
  15. [1, 3, 2, 4]
  16. [3, 1, 2, 4]
  17. [3, 2, 1, 4]
  18. [3, 2, 4, 1]
  19. [1, 3, 4, 2]
  20. [3, 1, 4, 2]
  21. [3, 4, 1, 2]
  22. [3, 4, 2, 1]
  23. [1, 2, 4, 3]
  24. [2, 1, 4, 3]
  25. [2, 4, 1, 3]
  26. [2, 4, 3, 1]
  27. [1, 4, 2, 3]
  28. [4, 1, 2, 3]
  29. [4, 2, 1, 3]
  30. [4, 2, 3, 1]
  31. [1, 4, 3, 2]
  32. [4, 1, 3, 2]
  33. [4, 3, 1, 2]
  34. [4, 3, 2, 1]

  35. 第二种方法:python标准库
  36. 有1,2,3,4这4个数字,能组成多少个互不相同且无重复数字的三位数。

  37. import itertools
  38. print list(itertools.permutations([1, 2, 3,4],3))


  39. 源代码如下:
  40. #coding:utf-8
  41. """
  42. 迪艾姆python培训 黄哥改写

  43. """
  44. import itertools
  45. print list(itertools.permutations([1, 2, 3,4],3))

  46. def perms(elements):
  47.     if len(elements) <=1:
  48.         yield elements
  49.     else:
  50.         for perm in perms(elements[1:]):
  51.             for i in range(len(elements)):
  52.                 yield perm[:i] + elements[0:1] + perm[i:]

  53. for item in list(perms([1, 2, 3,4])):
  54.     print item


  55. 第三种:看看官方文档上写的代码
  56. def permutations(iterable, r=None):
  57.     # permutations('ABCD', 2) --> AB AC AD BA BC BD CA CB CD DA DB DC
  58.     # permutations(range(3)) --> 012 021 102 120 201 210
  59.     pool = tuple(iterable)
  60.     n = len(pool)
  61.     r = n if r is None else r
  62.     if r > n:
  63.         return
  64.     indices = range(n)
  65.     cycles = range(n, n-r, -1)
  66.     yield tuple(pool[i] for i in indices[:r])
  67.     while n:
  68.         for i in reversed(range(r)):
  69.             cycles[i] -= 1
  70.             if cycles[i] == 0:
  71.                 indices[i:] = indices[i+1:] + indices[i:i+1]
  72.                 cycles[i] = n - i
  73.             else:
  74.                 j = cycles[i]
  75.                 indices[i], indices[-j] = indices[-j], indices[i]
  76.                 yield tuple(pool[i] for i in indices[:r])
  77.                 break
  78.         else:
  79.             return

  80. for item in list(permutations([1, 2, 3,4],3)):
  81.     print item

  82. 第四种 递归求m个list中,n个

  83. def perm(items, n=None):
  84.     if n is None:
  85.         n = len(items)
  86.     for i in range(len(items)):
  87.         v = items[i:i+1]
  88.         if n == 1:              
  89.             yield v
  90.         else:
  91.             rest = items[:i] + items[i+1:]
  92.             for p in perm(rest, n-1):     
  93.                 yield v + p
复制代码

建议百度
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-9 09:40:05 | 显示全部楼层

非常感谢版主的答案。
我之前有百度过,对于全排列这个问题,我后来想按照自己的思路码一码代码,想看看自己的错误究竟在什么地方,这个报错的原因在哪里,这样才能找到自己的知识盲区。
再次感谢版主。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-9 09:41:44 | 显示全部楼层
尼塔玛澈丹 发表于 2017-4-9 09:40
非常感谢版主的答案。
我之前有百度过,对于全排列这个问题,我后来想按照自己的思路码一码代码,想看看 ...

向大佬学习!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-23 14:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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