python-遍历列表并删除元素的最佳方法是什么?我目前的操作方式会导致元素被跳过
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python-遍历列表并删除元素的最佳方法是什么?我目前的操作方式会导致元素被跳过,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1838字,纯文字阅读大概需要3分钟。
内容图文
我正在使用此方法,但是for循环跳过了元素.调试后,我知道为什么会跳过,所以我想知道是否有更好的方法或正确的方法.
这是我的代码:
class Birthday:
name = ''
date = ''
def __init__(self, name, date):
self.name = name
self.date = date
...
dt1 = datetime.datetime.utcfromtimestamp(1428916628.0) # Year: 2015
dt2 = datetime.datetime.utcfromtimestamp(1328916628.0) # Year: 2012
dt3 = datetime.datetime.utcfromtimestamp(1228916628.0) # Year: 2008
dt4 = datetime.datetime.utcfromtimestamp(1128916628.0) # Year: 2005
dt5 = datetime.datetime.utcfromtimestamp(1028916628.0) # Year: 2002
b1 = Birthday('John', dt1)
b2 = Birthday('Larry', dt2)
b3 = Birthday('David', dt3)
b4 = Birthday('Joe', dt4)
b5 = Birthday('Jerry', dt5)
# Elements are mixed on purpose
dt_list = [b3, b1, b5, b4, b2]
# Sort the order of elements by date
dt_list.sort(key=lambda y: y.date)
for x in dt_list:
dt_list.remove(x)
if len(dt_list) <= 3:
break
Expected: 2008, 2012, 2015
Result: 2005, 2012, 2015
我正在考虑将其添加到for循环的第一行:
x = dt_list[0]
但这感觉不对.
解决方法:
迭代过程中的变异是不好
首先,对要迭代的列表进行突变很少是一个好主意.特别是,这是您当前问题的根源.让我们看一个类似的例子.
l = [1, 2, 3, 4]
for x in l:
l.remove(x)
print(l) # [2, 4]
遍历列表将返回l [0],l [1],l [2] …,依此类推,直到到达列表末尾.特别是,这意味着如果索引更改,您可能会跳过某些元素.这就是这里发生的情况.
如果要更改列表,请按以下步骤操作.
l = [1, 2, 3, 4, 5]
del l[:-3]
print(l) # [3, 4, 5]
虽然,变异数据并不比创建新列表更省时.当您从列表中删除一个元素时,接下来的元素需要向左移动,这很昂贵.上面的操作是O(n),其中n是列表的长度.
在这种情况下,创建新列表实际上更有效.
切片
切片列表将返回一个新列表,并且为O(k),其中k是切片的大小.因此,恢复最后三个元素实际上是在恒定时间内进行的.
l = [1, 2, 3, 4, 5]
new_l = l[-3:]
print(new_l) # [3, 4, 5]
此外,由于list .__ getitem__函数是用C编写的,因此与for循环相比,它的速度非常快.
这是仅获取最后三个元素的最快方法.
内容总结
以上是互联网集市为您收集整理的python-遍历列表并删除元素的最佳方法是什么?我目前的操作方式会导致元素被跳过全部内容,希望文章能够帮你解决python-遍历列表并删除元素的最佳方法是什么?我目前的操作方式会导致元素被跳过所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。