鱼C论坛

 找回密码
 立即注册
查看: 1832|回复: 8

[已解决]列表嵌套问题

[复制链接]
发表于 2020-10-9 20:37:03 | 显示全部楼层 |阅读模式

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

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

x
name_list = [['a','b','c'],['d','e','f'],['g','h','j'],['da','y']
假如这个嵌套列表中有很多数据,我想要取'e‘这个数据,但我也不知道它存不存在,也不知道它放在那个位置,我要怎么才能判断它存不存在?怎么找到它?求大神帮助
最佳答案
2020-10-9 22:05:24
以下程序兼容各种数据类型查找, 如果仅仅为了查找字符串可能由更好的方式
name_list = [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'j'], ['da', 'y'], "b"]

def depth_find(a_list, obj, index=""):
    """
    本函数取值是按照先广度查找, 后深度查找. 如果没有找到则返回None
    :param a_list: 查找的列表
    :param obj: 查找元素
    :return: str, 用来表示索引位置. ".0.1.4"可以用a_list[0][1][4]取到obj值
    """
    try:
        i = a_list.index(obj)
        return index + "." + str(i)
    except ValueError:
        for i, value in filter(lambda x: isinstance(x[1], list), enumerate(a_list)):
            son_index = depth_find(value, obj, index + "." + str(i))
            if son_index:
                return son_index


print(depth_find(name_list, "z"))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-10-9 21:01:46 | 显示全部楼层
应该没有直接可以解决的内置方法吧,应该要用自己写的方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-9 21:22:00 | 显示全部楼层
这个其实有点难
首先你要排除成环的可能
因为
>>> a = []
>>> b = []
>>> a.append(b)
>>> b.append(a)
>>> a
[[[...]]]
>>> b
[[[...]]]
然后递归搜索
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-9 21:51:15 | 显示全部楼层
简单粗暴的办法
>>> name_list = [['a','b','c'],['d','e','f'],['g','h','j'],['da','y']]
>>> temp = str(name_list)
>>> 'e' in temp
True
>>> 'da' in temp
True
>>> 'z' in temp
False
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-9 22:05:24 | 显示全部楼层    本楼为最佳答案   
以下程序兼容各种数据类型查找, 如果仅仅为了查找字符串可能由更好的方式
name_list = [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'j'], ['da', 'y'], "b"]

def depth_find(a_list, obj, index=""):
    """
    本函数取值是按照先广度查找, 后深度查找. 如果没有找到则返回None
    :param a_list: 查找的列表
    :param obj: 查找元素
    :return: str, 用来表示索引位置. ".0.1.4"可以用a_list[0][1][4]取到obj值
    """
    try:
        i = a_list.index(obj)
        return index + "." + str(i)
    except ValueError:
        for i, value in filter(lambda x: isinstance(x[1], list), enumerate(a_list)):
            son_index = depth_find(value, obj, index + "." + str(i))
            if son_index:
                return son_index


print(depth_find(name_list, "z"))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-9 22:27:58 | 显示全部楼层

列表也可以转换成字符串格式吗?如果可以,用这个方法判断元素是否存在于嵌套列表中,实在太秒了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-9 22:30:10 | 显示全部楼层
爷傲奈我何? 发表于 2020-10-9 22:27
列表也可以转换成字符串格式吗?如果可以,用这个方法判断元素是否存在于嵌套列表中,实在太秒了

的确可以判断元素是否存在,验证了下。但怎么找到这个元素的位置呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-10 20:35:29 | 显示全部楼层
BSOD 发表于 2020-10-9 22:05
以下程序兼容各种数据类型查找, 如果仅仅为了查找字符串可能由更好的方式

这段代码  for i, value in filter(lambda x: isinstance(x[1], list), enumerate(a_list)):
            son_index = depth_find(value, obj, index + "." + str(i))
            if son_index:
                return son_index
我不是很明白它是怎么执行的,尤其是   if son_index:是怎么判断条件成立的,求教
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-10 21:32:02 | 显示全部楼层
爷傲奈我何? 发表于 2020-10-10 20:35
这段代码  for i, value in filter(lambda x: isinstance(x[1], list), enumerate(a_list)):
           ...

这里判断的有两种情况:
1. 如果list深度为1, 没有找到, 返回None
2. 如果for循环没有主动返回, 表子list中不存在, 返回None
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-18 09:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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