【问题标题】:Making nested lists in Python在 Python 中创建嵌套列表
【发布时间】:2017-10-01 10:36:28
【问题描述】:

这是问题:

“编写一个函数 find_all(L, i),它接受一个嵌套列表 L 和一个项目 i 和,打印L 中所有出现的 i 的索引。

什么:

from string import *
def find_all(L,i):
    for sub_list in L:
        if i in sub_list:
            return (L.index(sub_list), sub_list.index(i))
print find_all([[1,2,3],[4,5],[6],[5,13]], 5)

输出只有 (1,1)。

【问题讨论】:

  • 好吧,当你偶然发现第一个有效结果时,你就是returning,这显然不是你所需要的。此外,标题具有误导性,因为您实际上并没有“制作”任何嵌套列表。
  • 除了ForceBru提到的问题,你需要改变你的逻辑,让它处理L中包含i的重复子列表,或者i在子列表中重复。提示:如果您使用enumerate,您将不需要进行效率低下的L.index(sub_list) 搜索。
  • from string import 的(无效)是什么?

标签: python list nested


【解决方案1】:
ll = [[1,2,3],[4,5],[6],[5,13]]

def find_all(ll,num):
  for index_inner,inner_list in enumerate(ll):
    for index,item in enumerate(inner_list):
      if item == num:
        print('List :',inner_list,'List Index :',index_inner, 'Index :' ,index)

find_all(ll,5)  

结果

List : [4, 5] List Index : 1 Index : 1
List : [5, 13] List Index : 3 Index : 0

【讨论】:

    【解决方案2】:

    您应该使用 yield 而不是 return。 Yield 返回一个生成器表达式,然后可以将其转换为 list

    def find_all(L,i):
        for sub_list in L:
            if i in sub_list:
                yield (L.index(sub_list), sub_list.index(i))
    print list(find_all([[1,2,3],[4,5],[6],[5,13]], 5))
    

    或者,如果你想默认返回一个列表,定义一个临时返回列表。

    def find_all(L,i):
        returnLi = []
        for sub_list in L:
            if i in sub_list:
                returnLi.append((L.index(sub_list), sub_list.index(i)))
        return returnLi
    print find_all([[1,2,3],[4,5],[6],[5,13]], 5)
    

    最后,如果您不需要列表或不想使用 yield,您可以简单地在找到结果时打印出来:

    def find_all(L,i):
        for sub_list in L:
            if i in sub_list:
                print((L.index(sub_list), sub_list.index(i)))
    find_all([[1,2,3],[4,5],[6],[5,13]], 5)
    

    【讨论】:

    • yield 对于 OP 来说可能有点高级。他们不需要列表,因此他们可以在找到结果时打印结果。另请参阅我对该问题的第一条评论。
    • @PM2Ring 我添加了额外的选项。如果可能的话,我认为让 OP 学习一些已知的东西会很好。
    【解决方案3】:

    if i in sub_list:满意时,你循环中的返回函数立即退出循环。

    要打印所有这些,只需创建一个临时变量作为列表来存储数据,如下所示:

    from string import *
    temp = []
    def find_all(L,i):
        for sub_list in L:
            if i in sub_list:
                temp.append([L.index(sub_list), sub_list.index(i)])
        return temp
    

    【讨论】:

      【解决方案4】:

      由于您使用的是 return,它会在找到第一个结果后终止程序而不是继续,所以这样做:

      def find_all(mylist, char):
          for sub_list in mylist:
              if char in sub_list:
                  print ("({},{})".format(mylist.index(sub_list),sub_list.index(char)))
      
      find_all([[1,2,3],[4,5],[6],[5,13]], 5)
      

      输出:

      (1 ,1)
      (3, 0)
      

      【讨论】:

      • 编辑@PM2Ring
      • 在示例数据上可以正常工作,但请参阅我对该问题的第一条评论。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-11
      • 2022-01-16
      • 1970-01-01
      • 2022-01-19
      • 2017-06-14
      • 2019-03-29
      相关资源
      最近更新 更多