фильтрующие элементы в массиве присутствуют в наборе - PullRequest
1 голос
/ 08 мая 2020

Я хочу отфильтровать элементы из массива Int в зависимости от того, присутствуют ли они в другом массиве (на самом деле они являются ключевыми значениями в словаре). Что у меня есть:

array1= [1 2 3 4 5]
array2= [1 2 3 4 5 6 7 8 9 10]

Что я хочу (что-то вроде):

> filter!(a->a!=array1,array2)
[6 7 8 9 10]

1 Ответ

2 голосов
/ 08 мая 2020

Вы создаете двумерный 1×10 Array{Int64,2}, и для вашего случая Vector обычно более естественен. Используйте запятые (,) или, возможно, если у вас действительно есть такая структура данных, отбросьте измерение с выражением [:]:

array1= [1, 2, 3, 4, 5]
array2= [1 2 3 4 5 6 7 8 9 10][:]

Теперь для фильтрации проверьте идентификатор каждого элемента в наборе.

julia> filter(x -> !(x in Set(array1)), array2)
5-element Array{Int64,1}:
  6
  7
  8
  9
 10

Если фильтрация выполняется много раз, этот код можно выполнить быстрее с помощью двоичного поиска:

julia> sort!(array1);

julia> filter(x -> length(searchsorted(array1,x))==0, array2)
5-element Array{Int64,1}:
  6
  7
  8
  9
 10

Наконец, вы можете использовать filter! для изменения вектора на месте.

...