Python使用for循环迭代列表时跳过最后一个元素

Python skipping last element in while iterating a list using for loop

本问题已经有最佳答案,请猛点这里访问。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Sample:

    def __init__(self):
        self.lst_report_footer_strings = ['Manager', 'Accountant', 'Created By',
                                         'fifth', '', '']
        int_size_of_string = 0
        lst_temp_report_footer = self.lst_report_footer_strings
        for lst_report_footer_item in self.lst_report_footer_strings:
            print lst_temp_report_footer
            print lst_report_footer_item
            if lst_report_footer_item in ('', ' '):
                print"Inside if : Item ==" + lst_report_footer_item
                lst_temp_report_footer.remove(lst_report_footer_item)  
                print"list after remove ==" + str(lst_temp_report_footer)
            else:
                print"Inside else : length =", str(len(lst_report_footer_item))
                int_size_of_string += len(lst_report_footer_item)


if __name__ == '__main__':
    ins_class = Sample()

产量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
['Manager', 'Accountant', 'Created By', 'fifth', '', '']
Manager
Inside else : length =  7
['Manager', 'Accountant', 'Created By', 'fifth', '', '']
Accountant
Inside else : length =  10
['Manager', 'Accountant', 'Created By', 'fifth', '', '']
Created By
Inside else : length =  10
['Manager', 'Accountant', 'Created By', 'fifth', '', '']
fifth
Inside else : length =  5
['Manager', 'Accountant', 'Created By', 'fifth', '', '']

Inside if : Item ==
list after remove == ['Manager', 'Accountant', 'Created By', 'fifth', '']

我需要的是……

1
list after remove == ['Manager', 'Accountant', 'Created By', 'fifth']


我把它变成了一段简单得多的代码,并试图找出你真正想做的事情。有很多不必要的代码,为什么要用一个类来说明您的问题?

1
2
3
4
5
>>> x=['Manager', 'Accountant', 'Created By', 'fifth', '', '']
>>> result = [i for i in x if i.strip()]
>>> result
['Manager', 'Accountant', 'Created By', 'fifth']
>>>


这相当于您的类,sans调试打印,并带有一个简短的变量名。

1
2
3
4
5
6
7
8
9
10
class Sample:
   def __init__(self):
       self.footers = ['Manager', 'Accountant', 'Created By', 'fifth', '', '']
       self.footers = [x for x in self.footers if x.strip() !=""]
       self.int_size_of_string = sum(len(x) for x in self.footers)

if __name__ == '__main__':
    myclass = Sample()
    print myclass.footers
    print myclass.int_size_of_string

我还将int_size_of_string设置为一个属性,因为一旦__init__完成,它就不可访问(您不能从__init__返回值)。strip方法从字符串两端删除任意数量的空格和其他空白字符。

代码不起作用的原因是在迭代列表时修改了列表。您删除了从第二个到最后一个项目,所以最后一个项目取代了它,然后当它移到下一个项目时,就没有剩余的项目了。


好吧,它不起作用的原因是循环遍历了列表中的每个项。当它找到一个空间时,它会删除该项。并显示当前列表。所以第一次,它会向你展示空间,因为其中有2个。

但是,现在您的循环失败了,因为您在循环中修改了列表,因此没有更多的项可供它循环使用,因为您在6项中的第5项,然后删除了第5项,现在列表只包含5项,但循环查找第6项。既然没有,它就退出了。让列表保持原样。

基本上,您应该做的是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Sample:
   def __init__(self):
       self.lst_report_footer_strings = \
['Manager', 'Accountant', 'Created By', 'fifth', '', '']
       int_size_of_string = 0
       lst_temp_report_footer = self.lst_report_footer_strings
       temp_remove_list = []
       for lst_report_footer_item in xrange(len(self.lst_report_footer_strings)):
           print lst_temp_report_footer
           print self.lst_report_footer_strings[lst_report_footer_item]
           if lst_temp_report_footer[lst_report_footer_item] in ['',' ']:
               print"Inside if : Item =="+self.lst_report_footer_strings[lst_report_footer_item]
               temp_remove_list.append(lst_report_footer_item)  
           else:
               print"Inside else : length =",str(len(lst_temp_report_footer[lst_report_footer_item]))
               int_size_of_string += len(lst_temp_report_footer[lst_report_footer_item])

       for item in reversed(temp_remove_list):
           del lst_temp_report_footer[item]

       print"final list : ==",lst_temp_report_footer

if __name__ == '__main__':
    ins_class = Sample()

注意-这个文件中的标签有点奇怪,我希望它适合您。