перечислить разницу и совпадение между двумя наборами данных - PullRequest
0 голосов
/ 11 января 2012

У меня есть два набора данных, A и B. Формат каждого набора данных - одно число на строку. Например,

12345

23456

67891

2345900

12345

Некоторые данные в A не включены в набор данных B. Как перечислить все эти данные в A и как перечислить все эти данные, совместно используемые A и B. Возможно ли это сделать в Perl?

Ответы [ 2 ]

5 голосов
/ 11 января 2012

Это в FAQ :

Как вычислить разницу двух массивов? Как вычислить пересечение двух массивов?

Используйте хэш. Вот код, чтобы сделать и то, и другое. Предполагается, что каждый элемент уникален в данном массиве:

@union = @intersection = @difference = ();
%count = ();

foreach $element (@array1, @array2) { $count{$element}++ }

foreach $element (keys %count) {
    push @union, $element;
    push @{ $count{$element} > 1 ? \@intersection : \@difference }, $element;
}

Обратите внимание, что это симметричная разница, то есть все элементы в или А или В, но не в обоих. Думайте об этом как о операции xor.

1 голос
/ 11 января 2012

Да, это называется пересечение , и для него есть модуль: Set :: Intersection . Не использовал это все же.

Редактировать: Похоже, Array :: Utils также имеет метод пересечения, я бы использовал его вместо этого.

Если вы хотите запрограммировать это самостоятельно, вы можете сделать что-то вроде этого:

  • поместить значения в два массива
  • уникальные они ( Список :: MoreUtils имеет uniq ())
  • используйте хэш, чтобы подсчитать, сколько раз вы видели каждое значение
  • из хеша, извлеките значения count = 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...