鱼C论坛

 找回密码
 立即注册
查看: 3897|回复: 9

[已解决]计算嵌套列表中某一层列表的数字元素个数<新人求助>

[复制链接]
发表于 2021-5-22 12:29:01 | 显示全部楼层 |阅读模式

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

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

x
【问题描述】

输入一个嵌套列表nums,再输入一个层数n,求该层的数字元素个数。
【输入形式】

第一行输入列表,元素是自然数,包括方括号,逗号分隔
【输出形式】

整数
【样例输入】

[1,2,[3,4,[5,6],7],8]

3

【样例输出】

2
【样例说明】

输入样例的嵌套有三个层次,当输入3的时候,就是计算第三层次嵌套列表的数字元素个数。 如果输入的是2,则第2层次嵌套列表中,数字元素的个数是3.

我的代码在测试时有两个数据不通过,但我自己执行的时候是可以的,希望能看到大佬的代码对比然后改进自己的代码
最佳答案
2021-5-22 15:28:25
qq1151985918 发表于 2021-5-22 14:10
刚看了下,是不太一样,上个帖子 嵌套列表算一个元素,这个帖子不算,不过也没难多少,改一行代码就好了 ...

你2个贴的代码,和我对题目理解的不一至。不知道是不是我想多了。于是我上网找了下该题的相关资料,如下:
  1. data = [1, 2, [3, 4, [5, 6], 7, [5, 6]], 8, [3, 4, [5, 6], 7]]
  2. n = 3

  3. # 该函数是我以为的要达到的
  4. # 来自 https://blog.csdn.net/liurongke/article/details/116305467
  5. def function(lis,lev,rank):
  6.     cnt = 0
  7.     for i in lis:
  8.         if rank != lev and isinstance(i,list):    #如果当前层数不是指定层数,并且该元素为列表,那么我们就进入该列表,然后增加一个层数
  9.             cnt += function(i,lev,rank+1)
  10.         elif rank == lev and isinstance(i,int) or isinstance(i,float):   #如果是当前层数,并且是数字,就加起来
  11.             cnt += 1
  12.     return cnt

  13. print(function(data,n,1))               #函数(列表,指定层数,从第一层开始)


  14. # 该函数也是我以为的要达到的
  15. # 来自 https://www.cnblogs.com/dreamcoding/p/12694572.html
  16. def getSum(items,depth,n):
  17.     if type(items) == int:
  18.         if type(items) == int:
  19.             if depth == n:
  20.                 return 1
  21.             else:
  22.                 return 0
  23.     else:
  24.         if (type(items) == tuple) or (type(items) == list):
  25.             result = 0
  26.             for i in range(len(items)):
  27.                 result += getSum(items[i],depth+1,n)
  28.             return result
  29.         else:
  30.             return 0
  31. result = 0
  32. for i in range(len(data)):
  33.     result = result + getSum(data[i],1,n)
  34. print(result)



  35. # 该函数也是我以为的要达到的 (实现方式比效另类, 效率明显要比递归快)
  36. # 来自 https://tuenity.blog.csdn.net/article/details/102722592
  37. a = '[1, 2, [3, 4, [5, 6], 7, [5, 6]], 8, [3, 4, [5, 6], 7]]'
  38. c = n
  39. b = ''.join(a)
  40. num= 0
  41. sum=0
  42. for i in range(0,len(b)):
  43.     if(b[i]=='['):
  44.         num+=1
  45.     elif(b[i]==']'):
  46.         num-=1
  47.     if (c == num) and (b[i]!='[') and (b[i]!=']' and b[i]!=',' and b[i+1].isdigit()==False):
  48.         sum += 1
  49. print(sum)


  50. # 然后就是你们认为的结果
  51. def level(data:list) -> list:
  52.     res = [len([i for i in data if type(i) == int])]
  53.     for i in data:
  54.         if type(i) == list:
  55.             res += level(i)
  56.     return res

  57. print(level(data)[num - 1])

复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-5-22 13:19:45 | 显示全部楼层
本帖最后由 qq1151985918 于 2021-5-22 14:12 编辑

<font color="red">[已解决]</font>计算嵌套列表某一层次的元素数量&lt;新人求助&gt;(可以的话麻烦看看我的代码怎么改)
https://fishc.com.cn/thread-196130-1-1.html
(出处: 鱼C论坛)

刚发现本题跟我所回复的帖子中有所不同,上一个嵌套列表算一个元素,这一个是计算数字数量,有所区别,请对照。

  1. def level(data:list) -> list:
  2.     res = [len([i for i in data if type(i) == int])]
  3.     for i in data:
  4.         if type(i) == list:
  5.             res += level(i)
  6.     return res

  7. ##data = [1, 2, [3, 4, [5, 6], 7], 8]
  8. data = eval(input("输入嵌套列表:"))
  9. num = int(input("输入需要计算的层次:"))
  10. print(level(data)[num - 1])
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-22 13:59:02 | 显示全部楼层
qq1151985918 发表于 2021-5-22 13:19
[已解决]计算嵌套列表某一层次的元素数量&lt;新人求助&gt;(可以的话麻烦看看我的代码怎么改)
https://fish ...

求该层的数字元素个数

难度比你帖子上的难度大多了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-22 14:10:36 | 显示全部楼层
ba21 发表于 2021-5-22 13:59
求该层的数字元素个数

难度比你帖子上的难度大多了

刚看了下,是不太一样,上个帖子 嵌套列表算一个元素,这个帖子不算,不过也没难多少,改一行代码就好了。
  1. def level(data:list) -> list:
  2.     res = [len([i for i in data if type(i) == int])]
  3.     for i in data:
  4.         if type(i) == list:
  5.             res += level(i)
  6.     return res

  7. ##data = [1, 2, [3, 4, [5, 6], 7], 8]
  8. data = eval(input("输入嵌套列表:"))
  9. num = int(input("输入需要计算的层次:"))
  10. print(level(data)[num - 1])
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-22 14:34:59 | 显示全部楼层
我刚注意到,原来这两个帖子都是你问的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-5-22 15:28:25 | 显示全部楼层    本楼为最佳答案   
qq1151985918 发表于 2021-5-22 14:10
刚看了下,是不太一样,上个帖子 嵌套列表算一个元素,这个帖子不算,不过也没难多少,改一行代码就好了 ...

你2个贴的代码,和我对题目理解的不一至。不知道是不是我想多了。于是我上网找了下该题的相关资料,如下:
  1. data = [1, 2, [3, 4, [5, 6], 7, [5, 6]], 8, [3, 4, [5, 6], 7]]
  2. n = 3

  3. # 该函数是我以为的要达到的
  4. # 来自 https://blog.csdn.net/liurongke/article/details/116305467
  5. def function(lis,lev,rank):
  6.     cnt = 0
  7.     for i in lis:
  8.         if rank != lev and isinstance(i,list):    #如果当前层数不是指定层数,并且该元素为列表,那么我们就进入该列表,然后增加一个层数
  9.             cnt += function(i,lev,rank+1)
  10.         elif rank == lev and isinstance(i,int) or isinstance(i,float):   #如果是当前层数,并且是数字,就加起来
  11.             cnt += 1
  12.     return cnt

  13. print(function(data,n,1))               #函数(列表,指定层数,从第一层开始)


  14. # 该函数也是我以为的要达到的
  15. # 来自 https://www.cnblogs.com/dreamcoding/p/12694572.html
  16. def getSum(items,depth,n):
  17.     if type(items) == int:
  18.         if type(items) == int:
  19.             if depth == n:
  20.                 return 1
  21.             else:
  22.                 return 0
  23.     else:
  24.         if (type(items) == tuple) or (type(items) == list):
  25.             result = 0
  26.             for i in range(len(items)):
  27.                 result += getSum(items[i],depth+1,n)
  28.             return result
  29.         else:
  30.             return 0
  31. result = 0
  32. for i in range(len(data)):
  33.     result = result + getSum(data[i],1,n)
  34. print(result)



  35. # 该函数也是我以为的要达到的 (实现方式比效另类, 效率明显要比递归快)
  36. # 来自 https://tuenity.blog.csdn.net/article/details/102722592
  37. a = '[1, 2, [3, 4, [5, 6], 7, [5, 6]], 8, [3, 4, [5, 6], 7]]'
  38. c = n
  39. b = ''.join(a)
  40. num= 0
  41. sum=0
  42. for i in range(0,len(b)):
  43.     if(b[i]=='['):
  44.         num+=1
  45.     elif(b[i]==']'):
  46.         num-=1
  47.     if (c == num) and (b[i]!='[') and (b[i]!=']' and b[i]!=',' and b[i+1].isdigit()==False):
  48.         sum += 1
  49. print(sum)


  50. # 然后就是你们认为的结果
  51. def level(data:list) -> list:
  52.     res = [len([i for i in data if type(i) == int])]
  53.     for i in data:
  54.         if type(i) == list:
  55.             res += level(i)
  56.     return res

  57. print(level(data)[num - 1])

复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-22 15:40:56 | 显示全部楼层
本帖最后由 qq1151985918 于 2021-5-22 16:01 编辑
ba21 发表于 2021-5-22 15:28
你2个贴的代码,和我对题目理解的不一至。不知道是不是我想多了。于是我上网找了下该题的相关资料,如下 ...


哦,你是认为如果同一层次可能有多个列表,可能题目样例没体现出来,其实那样用我这个递归也并不难
  1. data = [1, 2, [3, 4, [5, 6], 7, [5, 6]], 8, [3, 4, [5, 6], 7]]
  2. n = 3
  3. def level(data:list) -> list:
  4.     res = [len([i for i in data if type(i) == int])]
  5.     same_level = []
  6.     for i in data:
  7.         if type(i) == list:
  8.             same_level += i
  9.     if same_level:
  10.         res += level(same_level)
  11.     return res

  12. print(level(data)[n - 1])
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-22 15:48:49 | 显示全部楼层
qq1151985918 发表于 2021-5-22 15:40
哦,你是认为如果同一层次可能有多个列表,可能题目样例没体现出来,其实那样用我这个递归也并不难

不错
不过还是另类那个好。。

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-22 15:59:34 | 显示全部楼层
本帖最后由 qq1151985918 于 2021-5-22 16:18 编辑
ba21 发表于 2021-5-22 15:48
不错
不过还是另类那个好。。


另类那个比较容易出bug,比如说,如果输入了两个空格就会出bug,如果有负号也会有bug,当然负数不是自然数,
或许改成  b = str(eval(a)) 好一些
或者把最后一个条件改成 (b[ i ].isdigit()==True and b[i+1].isdigit()==False)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-22 16:21:47 | 显示全部楼层
感谢,我看看
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-23 12:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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