Удалить массив записей из другого массива

У меня есть 2 массива

    a=(1,2,3,4,5)
    b=(2,4)

вывод должен быть

    c=(1,3,5) 

(который должен быть результатом ab)

Я пытался используя

    unset a[${b}] 

какие-либо идеи?

Теперь я работаю с циклом, который проходит 700 000 итераций.

2
задан 13 May 2015 в 16:30

4 ответа

В первую очередь, если Вы хотите сделать это для 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 разговор, это - массив с одним элементом, но это - по существу то же как строка, что касается удара.

5
ответ дан 13 May 2015 в 16:30

Сложность задача (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[@]}
0
ответ дан 13 May 2015 в 16:30

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
0
ответ дан 13 May 2015 в 16:30

В 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. Также обратите внимание, что эта операция будет быстра и память, эффективная для больших наборов данных, поскольку мы использовали выражение .

генератора python
0
ответ дан 13 May 2015 в 16:30

Другие вопросы по тегам:

Похожие вопросы: