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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> уникальные элементы массива 
:(
    Опции темы
mario315
Дата 27.9.2009, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Добрый вечер. Подскажите, пожалуйста, есть ли какая функция, с помощью которой, можно получить из массива заданное количество уникальных (не повторяющихся) элементов.
PM MAIL   Вверх
ginnie
Дата 27.9.2009, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



Если последовательность не важна, то

Код

my %temp;
for my $elem (@array) {
    $temp{$elem} = 1;
    last if (scalar keys %temp == $count);
}
my @uniq_range = keys %temp;


если последовательность важна, то

Код

my %temp;
my @uniq_range;
for my $elem (@array) {
    unless (exists $temp{$elem}) {
        push(@uniq_range, $elem);
        $temp{$elem} = 1;
        last if (scalar @uniq_range == $count);
    }
}


Это сообщение отредактировал(а) ginnie - 27.9.2009, 21:24


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
DaemonSuw
Дата 27.9.2009, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



@mas = (1,2,3,12,3,3,4,4);
$count = 2;
map {$hash{$_}++} @mas;
foreach (keys %hash) { if ($hash{$_} == 1) { print "$_ => $hash{$_}\n" if $count > $i; $i++; }}

Добавлено @ 21:24
ginnie, а если такие условие?
@array = (1,2,3,4,5,1);
$count = 6;
Цитата

my %temp;
for my $elem (@array) {
    $temp{$elem} = 1;
    last if (scalar keys %temp == $count);
}
my @uniq_range = keys %temp;

После отработки 
41325 - хотя 1 - не уникальный элемент




Это сообщение отредактировал(а) DaemonSuw - 27.9.2009, 21:36
PM MAIL ICQ   Вверх
Pfailed
Дата 27.9.2009, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

last if (scalar keys %temp == $count);


А по ресурсам не накладно на каждой итерации вычислять такое выражение, не подскажете? Возможно лучше инкрементную переменную ввести?


--------------------
PM MAIL   Вверх
ginnie
Дата 27.9.2009, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



DaemonSuw, наверное я неверно понял задачу. Я прочитал "надо получить N уникальных в рамках нового массива элементов".

Это сообщение отредактировал(а) ginnie - 27.9.2009, 22:10


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
ginnie
Дата 27.9.2009, 22:05 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



Pfailed, по идее, scalar keys %temp - должно браться из поля KEYS структуры HV (которая представляет хэш), поэтому не должно негативно влиять на производительность. Как дела обстоят на самом деле - не знаю, надо измерять.


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
mario315
Дата 27.9.2009, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо, ginnie. Спасибо, DaemonSuw. Очень помогли.
PM MAIL   Вверх
jdoe
Дата 29.9.2009, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



use strict;
use warnings;

# takes: $count, $arr_ref
sub uniq {
    my @singles;
    for(@{$_[1]}) {
        do { push(@singles, $_); last if @singles==$_[0] } unless($_ ~~ @singles);
    }
    return @singles;
}

my @source = qw(1 0 1 6 3 3 1 2 4 2 2 1 1 3 4 2 1 3 4 5 6);

$, = ",";
print uniq( 4, \@source); #1,0,6,3
print "\n";
print uniq(-1, \@source); #1,0,6,3,2,4,5
print "\n";
print uniq(50, \@source); #1,0,6,3,2,4,5


PM MAIL   Вверх
gnatyna
Дата 30.9.2009, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Не экономично, зато писать просто)
Код

my @uniq = splice(@{[(keys %{{ map{+($_=>1)}@not_uniq}})]}, 0, $num);

PM MAIL   Вверх
amg
Дата 30.9.2009, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

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



Почти классика:
Код
my %seen;
my @uniq = (grep {!$seen{$_}++} @not_uniq)[0..$num-1];


PM MAIL   Вверх
gnatyna
Дата 1.10.2009, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(amg @ 30.9.2009,  15:21)
Почти классика:
Код
my %seen;
my @uniq = (grep {!$seen{$_}++} @not_uniq)[0..$num-1];

если $num больше числа уникальных, вернет undefы чтобы заполнить @uniq до $num-1
PM MAIL   Вверх
amg
Дата 1.10.2009, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

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



Цитата(gnatyna @  1.10.2009,  09:58 Найти цитируемый пост)
если $num больше числа уникальных, вернет undefы чтобы заполнить @uniq до $num-1
Да, это серъезный недостаток кода.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


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

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


 




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


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

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