我正在尝试在遍历列表时删除列表元素(数值)。我有两个例子。示例1有效,但示例2没有,即使两个示例都使用相同的逻辑。
示例1:工作
# adding more data
old.data$amount <- 1:9
old.data$a <- 10:18
# Retain all columns
keep_cols <- colnames(old.data)[-2] # Remove the column which is mentioned in by
setDT(old.data)[order(-date, location), .SD[1L], by = location, .SDcols = keep_cols]
# or assigning colnames to .SDcols directly:
setDT(old.data)[order(-date, location), .SD[1L], by = location, .SDcols = (colnames(old.data)[-2])]
location date amount a
1: NJ 2016 8 17
2: NM 2016 7 16
3: NY 2016 3 12
示例2:无法正常工作
list1=["5","a","6","c","f","9","r"]
print(list1)
for i in list1:
if str.isnumeric(i):
list1.remove(i)
print(list1)
我在item_list [:] :)中使用(for i)解决了示例2。但我无法理解为什么第二个例子在第一个地方不起作用的逻辑?
答案 0 :(得分:0)
我不能声称自己是Python方面的专家,因为我对它很不熟悉,但是我会给你一个我认为可能发生的事情的解释。
第一个示例实际上并没有比第二个示例更好,但是您用来测试它的数据是不同的,所以它没有显示。这个问题似乎是因为你在同一时间迭代任何修改,所以在第二个例子中会发生以下情况:
程序将遍历其给定的列表:
[“1”,“2”,“a”,“b”,“c”,“1”]
程序从列表项1开始。它是数字,因此被删除。现在列表不同了:
[“2”,“a”,“b”,“c”,“1”]
当你迭代时,它会移动到列表项2.这是有问题的,因为列表项2是“a”而不是“2”,所以它跳过“2”。
由于第一个示例中的数字由至少一个列表项分隔,因此不会出现问题,因为所有数字都会被迭代。
至于你提到的将list2
更改为list2[:]
的修复,我不知道那里发生了什么,因为当我通过PythonTutor的visualizor运行程序时,它似乎不起作用。
为了解决这个问题,对我来说最明显的解决方案是尝试向后遍历数组 - 从最终列表项开始并向列表的开头移动,因为这意味着您删除的任何项目都不会影响前一项的编号。
希望我帮忙!