鱼C论坛

 找回密码
 立即注册
查看: 3463|回复: 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个贴的代码,和我对题目理解的不一至。不知道是不是我想多了。于是我上网找了下该题的相关资料,如下:
data = [1, 2, [3, 4, [5, 6], 7, [5, 6]], 8, [3, 4, [5, 6], 7]]
n = 3

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

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


# 该函数也是我以为的要达到的
# 来自 https://www.cnblogs.com/dreamcoding/p/12694572.html
def getSum(items,depth,n):
    if type(items) == int:
        if type(items) == int:
            if depth == n:
                return 1
            else:
                return 0
    else:
        if (type(items) == tuple) or (type(items) == list):
            result = 0
            for i in range(len(items)):
                result += getSum(items[i],depth+1,n)
            return result
        else:
            return 0
result = 0
for i in range(len(data)):
    result = result + getSum(data[i],1,n)
print(result)



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


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

print(level(data)[num - 1])
想知道小甲鱼最近在做啥?请访问 -> 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论坛)

刚发现本题跟我所回复的帖子中有所不同,上一个嵌套列表算一个元素,这一个是计算数字数量,有所区别,请对照。
def level(data:list) -> list:
    res = [len([i for i in data if type(i) == int])]
    for i in data:
        if type(i) == list:
            res += level(i)
    return res

##data = [1, 2, [3, 4, [5, 6], 7], 8]
data = eval(input("输入嵌套列表:"))
num = int(input("输入需要计算的层次:"))
print(level(data)[num - 1])
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

求该层的数字元素个数

难度比你帖子上的难度大多了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

##data = [1, 2, [3, 4, [5, 6], 7], 8]
data = eval(input("输入嵌套列表:"))
num = int(input("输入需要计算的层次:"))
print(level(data)[num - 1])
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-22 14:34:59 | 显示全部楼层
我刚注意到,原来这两个帖子都是你问的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

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

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

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


# 该函数也是我以为的要达到的
# 来自 https://www.cnblogs.com/dreamcoding/p/12694572.html
def getSum(items,depth,n):
    if type(items) == int:
        if type(items) == int:
            if depth == n:
                return 1
            else:
                return 0
    else:
        if (type(items) == tuple) or (type(items) == list):
            result = 0
            for i in range(len(items)):
                result += getSum(items[i],depth+1,n)
            return result
        else:
            return 0
result = 0
for i in range(len(data)):
    result = result + getSum(data[i],1,n)
print(result)



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


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

print(level(data)[num - 1])
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

print(level(data)[n - 1])
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

想知道小甲鱼最近在做啥?请访问 -> 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)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-22 16:21:47 | 显示全部楼层
感谢,我看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-15 16:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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