【问题标题】:Search where a string is in a nested list搜索字符串在嵌套列表中的位置
【发布时间】:2018-01-08 21:18:27
【问题描述】:

我有一个嵌套列表,我的任务是查找它在嵌套列表中的位置。 例如,如果 list=["a",["b","c"]],那么 search(list,"b") 应该返回 2。 如果在任何深度都没有这样的字符串,那么函数应该返回 -1。 到目前为止,我有一个代码根据字符串是否在列表中返回 True/False。我该如何计算深度?

【问题讨论】:

  • 2扁平化列表中“b”的索引加一还是“b”本身的深度?
  • 拜托,你能发布一些你尝试过的东西的代码吗?
  • 请分享您拥有的代码。这个值 2 代表什么?它是在整个列表中的位置(忽略嵌套结构)、嵌套列表的深度还是它所在的列表索引? (您的示例不好,请给出更清晰的示例)
  • 列表[2,[[3,1],6.7,[2,1,6],8,["C",2,7,[[[1]],2]]怎么样?它有重复值、多层嵌套和不同的数据类型。
  • 将python变量命名为list是不好的做法。例如,list=5 将导致 list(set([1,1,2])) 返回 TypeError: 'int' object is not callable

标签: python list


【解决方案1】:

如果要搜索目标字符的深度,可以使用带有列表推导的递归:

def search(data, target, level):
   if target in data:
       return level
   levels = 0
   for row in filter(lambda x:isinstance(x, list), data):
       levels += search(row, target, level+1)
   return levels

val = search(['a', ['b', 'c']], 'b')
result = -1 if not val else val

输出:

2

不过,如果你想找到目标值所在的索引,你可以试试这个:

def flatten(l, target=str):
   if isinstance(l, target):
       yield l
   else:
       for i in l:
           for b in flatten(i):
              yield b

def search(data, target):
   new_list = list(flatten(data))
   return new_list.index(target)+1
print(search(['a', ['b', 'c']], 'b'))

输出:

2

【讨论】:

    猜你喜欢
    • 2013-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    • 2020-03-12
    • 2016-02-08
    • 2019-03-14
    相关资源
    最近更新 更多