У меня есть 2 массива
a=(1,2,3,4,5)
b=(2,4)
вывод должен быть
c=(1,3,5)
(который должен быть результатом ab)
Я пытался используя
unset a[${b}]
какие-либо идеи?
Теперь я работаю с циклом, который проходит 700 000 итераций.
В первую очередь, если Вы хотите сделать это для 700 000 повторений, действительно необходимо изучить что-то другое, чем удар. Кроме того, что Вы показываете, не массив в ударе, это - string1. Массивы разделяются пробелами, не запятыми.
Тем не менее вот является удар путем, принимая истинные массивы:
a=(1 2 3 4 5)
b=(2 4)
c=( $(printf "%s\n" "${a[@]}" "${b[@]}" | sort | uniq -u) )
При фактической запятой строк и не массивов используйте это вместо этого:
a=(1,2,3,4,5)
b=(2,4)
c=( $(sed 's/,/\n/g' <(printf "%s\n" "${a[@]}" "${b[@]}") | sort | uniq -u) )
С другой стороны, Вы могли использовать жемчуг вместо этого:
#!/usr/bin/perl
my @A=(1,2,3,4,5);
my @B=(2,4);
my %k;
map{$k{$_}++} (@A,@B);
my @C=grep($k{$_}==1,keys(%k));
print "@C\n";
1Strictly разговор, это - массив с одним элементом, но это - по существу то же как строка, что касается удара.
Сложность задача (O (N^2)) не может быть уменьшена; принятие только, что было явно задано (т.е. никакая гипотеза для значений и массива a
и b
) код ниже, просто проверит, присутствует ли каждое значение, существующее в a
также, в b
, и если значение присутствует, это повредит внутреннее for
цикл (единственная оптимизация, возможная с данной гипотезой), и добавит значение к c
; с большим количеством подсказок о содержании массивов a
и b
(т.е. если значения в каждом массиве могли бы быть повторены и если массивы отсортированы), мог бы быть еще некоторый простор для совершенствования:
#!/bin/bash
a=(1 2 3 4 5)
b=(2 4)
for i in ${a[@]}
do
match=0
for j in ${b[@]}
do
if [ "${i}" == "${j}" ]
then
match=1
break
fi
done
if [ "${match}" == 0 ]
then
c+=($i)
fi
done
echo ${c[@]}
perl
путь. Этот сценарий отображает все элементы в массиве a
, которые также содержатся в массиве b
.
#!/usr/bin/perl
my @a = (1,2,3,4,5);
my @b = (2,4,7,8,9,10);
# Create a hashmap with the entries in b as keys,
# but without values for the keys for a better lookup
# (exists ($hash{$element}))
my %hash;
@hash{@b}=();
foreach my $element (@a) {print "$element " unless exists($hash{$element})}
print "\n";
Вывод:
1 3 5
В python
, записи как:
a=(1,2,3,4,5)
b=(2,4)
iterables и известный как tuples
.
Ваша задача может быть легко сделана в python
:
#!/usr/bin/env python2
a = (1, 2, 3, 4, 5)
b = (2, 4)
c = tuple(i for i in a if i not in b)
print c
Вывод:
(1, 3, 5)
Здесь мы нашли значения кортежа a
, которые не существуют в кортеже b
и помещают их в другой кортеж c
. Также обратите внимание, что эта операция будет быстра и память, эффективная для больших наборов данных, поскольку мы использовали выражение .