【发布时间】:2013-11-03 03:11:46
【问题描述】:
在以下两个示例中,我尝试使用两种不同类型的循环从列表中删除否定元素。
首先我尝试使用普通循环for i in list,但在这种情况下,当我执行list1.remove(elm) 时,列表的大小会减少一个元素。因此,在下一个循环中,第二个元素移动到第一个元素位置。因此,在下一个循环中测试 if elm < 0 时遗漏了第二个元素。因此,它不会从列表中删除所有负面元素。
其次,我尝试使用切片。我从切片中了解到的是它创建了一个临时列表。所以,当我做for i in list2[:] 时,它会创建一个新的临时list2 = [-1,3,-2,-5,4,7,8],但我仍然没有清楚地了解它是如何工作的。它删除了所有负面元素。
#!/usr/env/bin
# remove all the negative value from the list.
list1 = [-1,3,-2,-5,4,7,8]
list2 = [-1,3,-2,-5,4,7,8]
# Looping through the list.
for elm in list1:
if elm < 0:
list1.remove(elm)
print 'list1: ', list1
# Looping through the list using slice.
for elm in list2[:]:
if elm < 0:
list2.remove(elm)
print 'list2: ', list2
Output:-python slice.py
list1: [3, -5, 4, 7, 8]
list2: [3, 4, 7, 8]
【问题讨论】:
-
注意“我从切片中了解到的是它创建了一个临时列表”。并不真地!它创建一个新列表,例如,
[1, 3, 6]创建一个新列表,或创建列表的任何其他。它“临时”的唯一意义是,在您的代码中,您没有将名称绑定到它。因此,一旦for循环完成对切片的迭代,切片就会变成垃圾。如果你完成了,例如temp = list2[:]并迭代temp,只要temp保持在范围内,副本就会存在。 -
嗨,蒂姆,如果我这样做
temp = list2[:]并迭代 temp,那么它就像我的第一个案例一样。但是,如果我循环list2[:]并从 list2 中删除,这意味着循环临时列表并从原始列表中删除。无论如何感谢您的评论。