![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| meridian |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 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 |
|||
|
||||
| ZeeLax |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 4388 Регистрация: 20.8.2006 Где: Алма-Ата Репутация: нет Всего: 88 |
Если я тебя правильно понял, то тебе нужно что-то типа этого
Выбирает уникальные элементы из соединения обоих массивов. Если что не так понял, извини. Это сообщение отредактировал(а) 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 |
|||
|
||||
| nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
meridian, ты что снова с тем вопрос мучиешься?
там были 100% уникальные, по крайне мере в последнем моём ответе а так работа с хешем
|
|||
|
||||
| ZeeLax |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 4388 Регистрация: 20.8.2006 Где: Алма-Ата Репутация: нет Всего: 88 |
Это сообщение отредактировал(а) 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 |
|||
|
||||
| nitr |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
ZeeLax, списывать надо верно ;) поправь свой код!
ты кукбука ;) @list в твоём скрипте нету Добавлено @ 17:42 а правим так:
|
||||
|
|||||
| ZeeLax |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 4388 Регистрация: 20.8.2006 Где: Алма-Ата Репутация: нет Всего: 88 |
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 |
|||
|
||||
| nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
ZeeLax, нехорошо править код
meridian, купи CookBook или по-русски Сборник рецептов (Perl) |
|||
|
||||
| Nab |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 26 Всего: 37 |
Нуууу, насколько я понял человеку нужна разница массивов, а без двух foreach я пока не нашел решения...
В CookBook описано еще несколько, а мое вот такое:
-------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
|||
|
||||
| nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
я запутался сорри... просто у него до этого такие же вопросы были |
|||
|
||||
| nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
вот... :
жуть, но зато исправился Добавлено @ 18:57 получаем a, c, i |
|||
|
||||
| Nab |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 26 Всего: 37 |
А вот таки решение с одним циклом...
Но тут конечно идет добаление и удаление... что не совсем хорошо по производительности и дефрагментации памяти, но как вариант покатит
-------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
|||
|
||||
| nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
Nab,
а что надо было человеку? оптимально или с одним циклом ;) |
|||
|
||||
| ZeeLax |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 4388 Регистрация: 20.8.2006 Где: Алма-Ата Репутация: нет Всего: 88 |
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 |
|||
|
||||
| nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
ZeeLax, я запутался (неверно понял вопрос) написал рабочий скрипт, но на данный вопрос не дал верного результата
З.Ы.: просьба не приводить ответы из кукбука |
|||
|
||||
| ZeeLax |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 4388 Регистрация: 20.8.2006 Где: Алма-Ата Репутация: нет Всего: 88 |
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 |
|||
|
||||
| amg |
|
||||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
До кучи, вот такое решение (прямо скажем, через ж...)
Ну и немного измененное из Perl Cookbook (вдруг человеку эта книга недоступна)
Надо иметь в виду, что эти и некоторые другие решения не будут работать правильно, если массивы содержат неуникальные элементы. Исправить ситуацию можно так (опять же, из Cookbook):
|
||||||
|
|||||||
| nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
данный код тож не даст результат
@array = grep { ! $seen{$_} ++ } @array; з.ы.: первый - ужас ;) Это сообщение отредактировал(а) nitr - 15.9.2006, 10:08 |
|||
|
||||
| sharq |
|
||||
![]() Perl Liker ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 13.12.2004 Где: Ростов-на-Дону Репутация: 23 Всего: 28 |
Привет, любителям экспериментов!
Мой вариант:
Результат:
-------------------- [color=gray]There's More Than One Way To Do It[/color] |
||||
|
|||||
| amg |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
Добавлено @ 10:49 Долго я ждал решения в одну строку. Наконец то! |
||||
|
|||||
| nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
а так?
Это сообщение отредактировал(а) nitr - 15.9.2006, 11:02 |
|||
|
||||
| amg |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
Работает!
А вот так - нет!
Это сообщение отредактировал(а) amg - 15.9.2006, 11:26 |
|||
|
||||
| nitr |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
а с ссылками так?
Добавлено @ 11:44 и код рабочий!
Добавлено @ 11:45 но он глупый |
||||||
|
|||||||
| meridian |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 95 Регистрация: 8.11.2005 Репутация: нет Всего: нет |
спасибо, нужно было действительно разницу массивов без 2-х foreach
будет ли код работать, если 1-й массив будет меньше 2-ого ? Это сообщение отредактировал(а) meridian - 15.9.2006, 12:01 |
|||
|
||||
| nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
вот лучше
|
|||
|
||||
| amg |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
Ну да, рабочий, если @array1 > @array2, а вот если наоборот... Я придумал, как исправить:
|
|||
|
||||
| nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
строчку 6 в http://forum.vingrad.ru/index.php?showtopi...st&p=855508
можно так
|
|||
|
||||
| amg |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
||||
|
||||
| nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
amg, добавивь твои комменты
Добавлено @ 12:17 короче, не мучиемся ;) используем код sharq и учимся так же программить |
|||
|
||||
| Danissimo |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 150 Регистрация: 14.8.2006 Где: Санкт-Петербург Репутация: 1 Всего: 1 |
Можно так:
my @array1 = qw( a b c d i f ); my @array2 = qw( b d f ); my %x; @x{@array1} = (1) x @array1; delete @x{@array2}; print join ' ', sort keys %x; Добавлено @ 12:28 Выше была разность двух множеств. А вот их обединение: my @array1 = qw( a b c d i f ); my @array2 = qw( b d f ); my %x; @x{@array1} = (1) x @array1; @x{@array2} = (1) x @array2; print join ' ', sort keys %x; |
|||
|
||||
| amg |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
||||
|
||||
| Danissimo |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 150 Регистрация: 14.8.2006 Где: Санкт-Петербург Репутация: 1 Всего: 1 |
Ты про объединение? или про разность? Объединение работает. Разность тоже работает. И выдает правильный результат. Имейте в виду, что разность -- некомутативная операция. Так что все правильно работает.
Другими словами, если множество X полностью является подмножеством Y, то вычитая из X Y, получаем пустое множество. Добавлено @ 13:39 А вот иллюстрация: my @array2 = qw( a b c d i f ); my @array1 = qw( b d g ); my %x; @x{@array1} = (1) x @array1; delete @x{@array2}; print join ' ', sort keys %x; Здесь множество array1 не является полным подмножеством array2. Что и сказывается на результате. |
|||
|
||||
| nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
amg :) ты меня вынуждаешь извращаться :)
и кста, Danissimo, свой код "подсвечивай"! |
|||
|
||||
| amg |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
Я про операцию, которая в некоторых книжках называется "симметричная разность". Перечитав еще раз самый первый пост, думаю, что именно коммутативная "симметричная разность" и была нужна. Кстати, nitr, понимаю, что выгляжу полным занудой, но твой последний код опять не работает, если поменять @array2 и @array1. (Чтобы работал, надо в нем && заменить на and). |
|||
|
||||
| meridian |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 95 Регистрация: 8.11.2005 Репутация: нет Всего: нет |
Спасибо sharq, amg, nitr и остальным извращенцам
Работает как надо, проверил все. |
|||
|
||||
| Nab |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 26 Всего: 37 |
Я вот тут посмотрел вашу писанину, и таки думаю что у amg идея была лучшая, но вы все одно кудато не туда рвонули
вот вариант в одну строку :
даст результат если в изначальных масивах значения уникальны, то есть в сумме дают 2, ну или четное число. кстати вариант sharq тоже этим страдает... А этот вариант дает разницу двух массивов, при условии что значения массивов не содержат символов пробела
можно тут конечно извратиться с заменой стандартного разделителя, но эт уже не то Это сообщение отредактировал(а) Nab - 18.9.2006, 07:32 -------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
||||
|
|||||
| Nab |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 26 Всего: 37 |
Вот блин дурная голова рукам спокоя не дает
Упростил...
-------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
|||
|
||||
| amg |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
Nab, респект!
Внёс твой однострочник (немного его модифицировав) в свою коллекцию Perl one-liners (там как раз разности не хватало)
|
|||
|
||||
| Nab |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 26 Всего: 37 |
знаешь почему у меня в конце звезда стоит и плюсик?
Звезда потому что на последней строке файла окончания нет, и твоя регулярка не сработает, а моя сработает. А плюсик, это потому что одинаковых строк в файле у тебя может быть несколько, но удалятся только две соседние, а с плюсом, все возможные... А вот первый плюсик у тебя не знаю к чему приведет, по крайней мере куча просто переводов строк у тебя не удалятся... если же тебя такое поведение устраивает, то можно еще более упростить твою регулярку...
-------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
|||
|
||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |