我有两个列表,它们都是长度相同的列表
list1 [[1 3 5 7] [2 5 1 6]]
list2 [[0.5 0.3 0.7 0.1] [0.1 0.4 0.6 0.2]]
我的任务是:如果list2中的数字<=例如0.2,则从list1中删除相应位置的项目。因此,根据以上示例,list2中<= 0.2的项为[[3] [0 3]],最终list1应该看起来像这样[[1 3 5] [5 1]]。然后应从list2中删除相同的项目,以便其最终版本看起来像[[0.5 0.3 0.7] [0.4 0.6]]。 下面的代码效果很好,但是如果列表很长(在我的模型中就是这种情况),它将变得非常慢 在没有运行循环的情况下,是否有任何有效的方法?
let k 0
foreach list2
[
x ->
let each_element_list2 x
let each_element_list1 k list1
(foreach each_element_list2
[
i ->
if i <= 0.2
[
let rem_pos position i each_element_list2
set each_element_list2 remove-item rem_pos each_element_list2
set each_element_list1 remove-item rem_pos each_element_list1
]
]
)
set list2 replace-item k list2 each_element_list2
set list1 replace-item k list1 each_element_list1
set k k + 1
]
先感谢
Magda
答案 0 :(得分:0)
这不是最优雅的代码,我没有时间一步一步地解释它,但是这样的事情应该起作用:
to remove-items
let list1 [[1 3 5 7 ] [2 5 1 6 ]]
let list2 [[0.5 0.3 0.7 0.1] [0.1 0.4 0.6 0.2]]
if length list1 != length list2 [ error "lists should be of equal length" ]
foreach range length list1 [ i ->
let sl1 item i list1 ; extract sublist 1
let sl2 item i list2 ; extract sublist 2
let indices-to-keep (
map first ; extract the index from the pair
filter [ p -> last p > 0.2 ] ; keep the pairs where the item is <= 0.2
(map list range (length sl2) sl2) ; build a list of index/item pairs
)
let replace-sublist [ [l sl] ->
replace-item i l (map [ j -> item j sl ] indices-to-keep)
]
set list1 (runresult replace-sublist list1 sl1)
set list2 (runresult replace-sublist list2 sl2)
]
print list1
print list2
end
仅需简单说明一下:请注意,我颠倒了条件(即> 0.2而不是<= 0.2),因为使用要保留的索引列表而不是要删除的索引更加容易。