-6

我是编程新手,但我已经阅读过 Java、C++、Javascript、PHP 的教程,但从未遇到过这样的事情。你能解释一下这段代码吗,尤其是isinstance

for each_item in movies:
    if isinstance(each_item, list):
        for nested_item in each_item:
            if isinstance(nested_item, list):
                for deeper_item in nested_item:
                    print(deeper_item)
            else:
                print(nested_item)
    else:
        print(each_item)
4

5 回答 5

3
# loop through each item in "movies"
for each_item in movies:

    # if the current item item is a list...
    if isinstance(each_item, list):

        # then loop through all the subitems...
        for nested_item in each_item:

            # and if yet again we meet a list...
            if isinstance(nested_item, list):

                # then loop through the items in this list
                for deeper_item in nested_item:
                    # and print the 3rd level item
                    print(deeper_item)

            # ... or print 2nd level item
            else:
                print(nested_item)

    # or print the 1st level item
    else:
        print(each_item)
于 2013-08-02T13:11:22.517 回答
1

如果您熟悉 Java,您可以构建一系列几乎相同的循环和检查,如下所示:

for (Object each_item: movies){
    if (each_item instanceof Collection){
        for (Object nested_item: each_item){
            if (nested_item instanceof Collection){
                for (Object deeper_item: nested_item){
                    System.out.println(deeper_item);
                }
            } 
            else{
                  System.out.println(nested_item);
            }
        else{
            System.out.println(each_item);
        }
    }
}
于 2013-08-02T13:11:51.757 回答
0

假设您的代码是这样的:

for each_item in movies:
    if isinstance(each_item, list):
        for nested_item in each_item:
            if isinstance(nested_item, list):
                for deeper_item in nested_item:
                    print(deeper_item)
            else:
                print(nested_item)
    else:
        print(each_item)

看起来您正在打印出潜在嵌套列表中的每个项目。如果对象(第一个参数)是类的实例(第二个参数),isinstance(object, classinfo) 返回 true。所以当你第一次调用 isinstance 时,你是在测试 each_item 是否是一个列表。如果它是一个列表,那么您将在列表中循环。

本质上,您正在查看列表中的第一项。如果它本身是一个列表,则查看其中的第一项。如果该项目是列表,则查看其中的第一项。如果在任何时候你发现一个不是列表的项目,你打印出那个项目。

所以像这样的列表: [1, 2, [3, 4, [5, 6]]] 会打印出来

1
2
3
4
5
6

给定您当前的代码。

如果你只是这样做

list = [1, 2, [3, 4, [5, 6]]]
for item in list:
    print(item)

它会打印

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

如果你要这样做

list = [1, 2, [3, 4, [5, 6]]]

for item in list:
   for num in item:
       for i in num:
           print i

你会得到一个错误,告诉你不能 for 循环一个数字,因为它不是一个可迭代的。

于 2013-08-02T13:13:20.657 回答
0

理解isinstance(each_item,list)需要得到以下两点:

  1. isinstance(A,B)回答问题“A 是 B 的实例吗?”
  2. list是一种 Python 类型(如dicttuple、和) set,可以通过几种不同的方式使用:strint

    • 将事物转换为列表:

      • list("oink") # ==> ['o', 'i', 'n', 'k'] 将字符串转换为字符列表
      • list((1,2,3))# ==> [1, 2, 3] 将元组转换为列表
    • 帮助弄清楚事物的类型

      • type([1,2,3]) == list # ==> True 发现某物的类型
      • isinstance([1,2,3],list)# ==> 真
于 2013-08-02T13:32:50.917 回答
0
for each_item in movies:  #each_item will be each movie
    if isinstance(each_item, list):  #check if each_item is a list
        for nested_item in each_item:  #if so, then nested_item will be each item in each_item
            if isinstance(nested_item, list): #check if nested_item is list
                for deeper_item in nested_item: # if so, deeper_item will be each item in nested_list
                    print(deeper_item)  #print out deeper_item
            else:
                print(nested_item) #print out nested_item
    else:
        print(each_item)  #print out each_item

所以 if movies = [1,2,3], theneach_item将在循环中取值 1,2,3。由于 1,2,3 不是列表,因此这些值会被打印出来。

如果movies = [1,[2,3]], theneach_item将采用值 1 和[2,3]循环。由于[2,3]是一个列表,它进入内部for循环。因此nested_item将采用值 2,3。

于 2013-08-02T13:10:31.030 回答