Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Формирование массива из 2-х с уник. значеними 
V
    Опции темы
meridian
Дата 14.9.2006, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 95
Регистрация: 8.11.2005

Репутация: нет
Всего: нет



Добрый день!

Есть 2 масива

@array1 = qw(  a b c d i f );
@array2 = qw( b d f )

Как  сформировать третий массив @array3 из уникальных элементов массивов @array1 и @array2
(т.е. д. получиться масив из a, c b i )

у меня получается c 2-мя  foreach че то громоздко


Это сообщение отредактировал(а) meridian - 14.9.2006, 16:13
PM   Вверх
ZeeLax
Дата 14.9.2006, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 4388
Регистрация: 20.8.2006
Где: Алма-Ата

Репутация: нет
Всего: 88



Если я тебя правильно понял, то тебе нужно что-то типа этого
Код

#!/usr/bin/perl -w

use strict;

my @array1 = qw( a b c d i f );
my @array2 = qw( b d f );
my @array3 = ();
my %seen = ();
foreach my $item (@array1, @array2) {
    push (@array3, $item) unless $seen{$item}++
}

print join(",", @array3), "\n";

Выбирает уникальные элементы из соединения обоих массивов. Если что не так понял, извини.

Это сообщение отредактировал(а) ZeeLax - 14.9.2006, 16:57


--------------------
Utility is when you have one telephone, luxury is when you have two, opulence is when you have three — and paradise is when you have none.
— Doug Larson
PM MAIL WWW ICQ Skype Jabber   Вверх
nitr
Дата 14.9.2006, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



meridian, ты что снова с тем вопрос мучиешься? smile
там были 100% уникальные, по крайне мере в последнем моём ответе smile
а так работа с хешем smile там ключи всегда уникальны smile как и код ZeeLax этот верен
Код

#!/usr/bin/perl -w
my @array1 = (1, 2, 3, 4, 5);
my @array2 = (6, 7, 3, 4, 1);
my %temp;
foreach (@array1, @array2) {
    $temp{$_} = 1;
}
my @array3 = sort keys %temp;



--------------------
PM   Вверх
ZeeLax
Дата 14.9.2006, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 4388
Регистрация: 20.8.2006
Где: Алма-Ата

Репутация: нет
Всего: 88



smile
Код

#!/usr/bin/perl -w

use strict;

my @array1 = qw( a b c d i f );
my @array2 = qw( b d f );
my @array3 = ();
my %seen = ();

@array3 = grep { ! $seen{$_} ++ } (@array1, @array2);
print join(",", @array3), "\n";


Это сообщение отредактировал(а) ZeeLax - 14.9.2006, 17:44


--------------------
Utility is when you have one telephone, luxury is when you have two, opulence is when you have three — and paradise is when you have none.
— Doug Larson
PM MAIL WWW ICQ Skype Jabber   Вверх
nitr
Дата 14.9.2006, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



ZeeLax, списывать надо верно ;) поправь свой код!
Код

#!/usr/bin/perl -w

use strict;

my @array1 = qw( a b c d i f );
my @array2 = qw( b d f );
my @array3 = ();
my %seen = ();

@array3 = grep { ! $seen{$_} ++ } @list;
print join(",", @array3), "\n";

ты кукбука ;) @list в твоём скрипте нету

Добавлено @ 17:42 
а правим так:
Код

#!/usr/bin/perl -w
use strict;

my @array1 = qw( a b c d i f );
my @array2 = qw( b d f );
my %seen;
my @array3 = grep { ! $seen{$_} ++ } (@array1, @array2);
print "@array3";



--------------------
PM   Вверх
ZeeLax
Дата 14.9.2006, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 4388
Регистрация: 20.8.2006
Где: Алма-Ата

Репутация: нет
Всего: 88



nitr, сам ты такой smile я с консоли списывал smile


--------------------
Utility is when you have one telephone, luxury is when you have two, opulence is when you have three — and paradise is when you have none.
— Doug Larson
PM MAIL WWW ICQ Skype Jabber   Вверх
nitr
Дата 14.9.2006, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



ZeeLax, нехорошо править код smile когда тебя поправить УСПЕЛИ!

meridian, купи CookBook или по-русски Сборник рецептов (Perl)


--------------------
PM   Вверх
Nab
Дата 14.9.2006, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 582
Регистрация: 25.3.2006
Где: Kiev

Репутация: 26
Всего: 37



Нуууу, насколько я понял человеку нужна разница массивов, а без двух foreach я пока не нашел решения...
В CookBook описано еще несколько, а мое вот такое:
Код

#!/usr/bin/perl -w
my @array1 = (1, 2, 3, 4, 5);
my @array2 = (6, 7, 3, 4, 1);
my %temp;

@{%temp}{@array1} = (0) x @array1;

foreach (@array2) {
    unless (exists $temp{$_}) {
        push(@array3, $_)
    } else {
     $temp{$_}++
    }

}
foreach (keys %temp) {
    push(@array3, $_) unless $temp{$_}
}

print "@array3";

1;



--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
nitr
Дата 14.9.2006, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



smile так я объединил массивы без дубликатов
я запутался smile
сорри... просто у него до этого такие же вопросы были smile)


--------------------
PM   Вверх
nitr
Дата 14.9.2006, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



вот... :
Код

#!/usr/bin/perl -w
my @array1 = qw(a b c d i f);
my @array2 = qw(b d f);
my %temp;
foreach (@array1, @array2) {
    if (exists $temp{$_} && $temp{$_} == 0) {
        $temp{$_} = 1;
    } else {
    $temp{$_} = 0;
    }
}
foreach ( sort keys %temp ) {
    push @array3, $_ if $temp{$_} == 0;
}
print "@array3";

жуть, но зато исправился smile

Добавлено @ 18:57 
получаем a, c, i


--------------------
PM   Вверх
Nab
Дата 14.9.2006, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 582
Регистрация: 25.3.2006
Где: Kiev

Репутация: 26
Всего: 37



А вот таки решение с одним циклом... 
Но тут конечно идет добаление и удаление... что не совсем хорошо по производительности и дефрагментации памяти, но как вариант покатит smile

Код

my @array1 = qw(a b c d i f);
my @array2 = qw(b d f z);
my (%temp, %temp2);

foreach (@array1, @array2) {
    $temp{$_}++;
    if ( $temp{$_} > 1 ) {
        delete $temp2{$_} if exists $temp2{$_}
    } else {
     $temp2{$_}++
    }

}

print "@{[keys %temp2]}";



--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
nitr
Дата 14.9.2006, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



Nab, 
а что надо было человеку? оптимально или с одним циклом ;)



--------------------
PM   Вверх
ZeeLax
Дата 15.9.2006, 06:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 4388
Регистрация: 20.8.2006
Где: Алма-Ата

Репутация: нет
Всего: 88



Цитата(nitr @  14.9.2006,  20:40 Найти цитируемый пост)
ZeeLax, списывать надо верно ;) поправь свой код!

nitr, ты попросил, я - поправил. От ошибки своей не отказывался вовсе.


--------------------
Utility is when you have one telephone, luxury is when you have two, opulence is when you have three — and paradise is when you have none.
— Doug Larson
PM MAIL WWW ICQ Skype Jabber   Вверх
nitr
Дата 15.9.2006, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



ZeeLax, я запутался (неверно понял вопрос) написал рабочий скрипт, но на данный вопрос не дал верного результата smile Всех поправил Nab. Я в свою очередь исправился smile ... 

З.Ы.: просьба не приводить ответы из кукбука smile


--------------------
PM   Вверх
ZeeLax
Дата 15.9.2006, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 4388
Регистрация: 20.8.2006
Где: Алма-Ата

Репутация: нет
Всего: 88



nitr, миру - мир smile


--------------------
Utility is when you have one telephone, luxury is when you have two, opulence is when you have three — and paradise is when you have none.
— Doug Larson
PM MAIL WWW ICQ Skype Jabber   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0688 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.