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 |
我还将
代码不起作用的原因是在迭代列表时修改了列表。您删除了从第二个到最后一个项目,所以最后一个项目取代了它,然后当它移到下一个项目时,就没有剩余的项目了。
好吧,它不起作用的原因是循环遍历了列表中的每个项。当它找到一个空间时,它会删除该项。并显示当前列表。所以第一次,它会向你展示空间,因为其中有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() |
注意-这个文件中的标签有点奇怪,我希望它适合您。