从基于其他列表的列表中删除多个项目

时间:2019-05-31 12:46:44

标签: netlogo

我有两个列表,它们都是长度相同的列表

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

1 个答案:

答案 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),因为使用要保留的索引列表而不是要删除的索引更加容易。