for循环中zip和enumerat的区别?

时间:2015-06-09 11:46:53

标签: python loops

代码在这里,它删除列表中的一些元素。 在循环条件下zip和枚举有什么区别? 似乎枚举产生了错误的结果。

def delete(elem_l, del_e):
    n_del = 0
    for e, i in zip(elem_l, range(len(elem_l))):
    # for i, e in enumerate(elem_l):
        print "cycle:", i, "elem:", elem_l[i - n_del],  "len:", len(elem_l)
        if e == del_e:
            del elem_l[i - n_del]
            n_del += 1


elem_list = [1, 2, 3, 4, 3, 5, 5, 4, 3]
delete(elem_list, 3)

1 个答案:

答案 0 :(得分:2)

这里有问题的是你对zip() function的使用。它会生成一个列表元组预先。您创建了添加了数字的原始列表的副本。来自文档:

  

此函数返回元组列表,其中 i -th元组包含每个参数序列中的 i -th元素或者迭代。

强调我的

因此,更改循环中的elem_l不会影响循环迭代计数。

另一方面,

enumerate()生成索引 on demand ,并且当删除elem_l列表时,生成的元素更少。如果您制作了elem_l的副本,则会获得相同的结果:

for i, e in enumerate(elem_l[:]):

其中[:]标识切片生成一个新列表,独立于原始elem_l列表,然后从循环中删除。