LINUX.ORG.RU

как удалить из первого массива все элементы второго

 


0

1

Дратути)

есть массив @a содержащий числа от 0 до 127 и есть генерируемый массив @b содержащий пару десятков чисел из диапазона от 0 до 127, числа могут идти не по порядку.

как из массива @a удалить все числа массива @b ?

заранее благодарен.

что-то типа

my %bh = map { $_ => 1 } @b;
@a = grep !defined $bh{$_},@a;

vel ★★★★★
()
@a = (1, 2, 3, 4);
@b = (2, 4);

my %seen;
@seen {@a} = ();
delete @seen {@b};
my @aonly = keys %seen;

print @aonly, "\n";
SyntaxError
()
use strict;
use warnings;
use feature 'say';
use experimental 'signatures';
use List::Util 'first';

sub in ($el, @arr) { defined(first { $_ == $el } @arr) }

my @a = (0..10);
my @b = (1, 3, 5, 7, 9);
my @c = grep { not in($_, @b) } @a;

say for @c; 
# 0
# 2
# 4
# 6
# 8
# 10

evbogdanov
()
Ответ на: комментарий от ravdinve

Можно и одной строчкой =)

@a=(0..10);@b=(1,3,5,7,9);$a=join' ',@a;$a=~s/\b$_\b//g for @b;print"$_\n" for split /\s+/,$a;
# 0
# 2
# 4
# 6
# 8
# 10
evbogdanov
()
Ответ на: комментарий от ravdinve

На перле вообще отличные однострочники получаются!

J ★★★★
()
Ответ на: комментарий от ravdinve

мда, еще и фреймворк запросов для такого подтягивать. а разве в перле нет filter какого-то? уже молчу про всякие ХОФ и прочие diff/intersect/union балбла

anonymous
()

красивое и читаемое решение - через filter, но хз если это есть в перл. сложность сублинейная.

эффективное - с помощью bool array размером 128, где индекс будет отвечать наличию элемента во втором массиве. сложность линейная. хз, если это возможно в перле.

используй нормальный язык

anonymous
()
25 ноября 2018 г.
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.