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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как выбрать необычные ключи из массива? задачка на массивы и хеши 
:(
    Опции темы
Suppir
Дата 10.2.2010, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



У меня есть массив из следующих строк:

4089149.1000 - рекомендациями
4089149 - письме
4089149 - Письмо
23841197.3 - Законом
23939435.1 - прилагаемому перечню
23962142.112 - Реестр
23962142.112 - Комиссии
10800200.2043 - уплачивают
10800200.28903 - представляют
10800200.3452 - представляют
10800200.90 - статья 90
10800200.12801 - пунктом 1 статьи   128
10800200.12802 - пункту 2 статьи   128
10800200.10104 - статьи 101.4
10800200.99 - статьи 99
10800200.97 - статьей 97
12054265.3000 - форме
10800200.90 - статьи 90
10800200.90 - статьи  90
10800200.90 - статьи 90
10800200.145 - статьей 145
12053802.11 - Законом
10800200.145 - статьи 145
10800200.145 - статьей 145
10800200.1456 - пунктом 6 статьи 145
10800200.145 - статьи 145
10800200.1451 - пунктом 1 статьи 145
10800200.145 - статьи 145
10800200.145 - статьей  145
10800200.145 - статьей  145
10800200.145 - статьей 145
23939271.6 - приложения  N  6
23939271.6 - приложения  N  6
23939271.6 - приложения  N  6
23939271.6 - приложения  N  6
23939271.6 - приложения  N  6
23939271.6 - приложения  N  6
23939271.6 - приложения 
23875307.17 - Правилами
10005643.6 - статьей 6


Т.е. в массиве как бы заключены пары "номер - значение". Как видите, номера часто повторяются и у одинаковых номеров одинаковые значения. Например, номеру "23939271.6" почти всегда соответствует значение  "приложения  N  6".

Необходимо для каждого номера, который повторяется более 3 раз вывести:
1) наболее характерное значение 
2) исключения
Например, для номера "23939271.6" характерным является значение "приложения  N  6", а исключением "приложения".




PM MAIL   Вверх
mvsgt
Дата 10.2.2010, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Лабораторная работа ?
PM MAIL   Вверх
Suppir
Дата 10.2.2010, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Нет, просто работа. Только у меня голова не работает  smile 

Это сообщение отредактировал(а) Suppir - 10.2.2010, 15:01
PM MAIL   Вверх
Vaneska
Дата 10.2.2010, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вот приблизительный алгоритм:
1. Делаем цикл по списку
2. Каждую строку разбиваем на ключ-значение
3. Кладем их в хеш следующей структурой
Код

$hash->{ключ} = {
   "значение1" => количество
   "значение2" => количество
};


4. Дальше осталось пройти по все ключам хеша
вывести нужные данные. В хеше будет статистика по кол. значений для каждого ключа.



Suppir, пиши код сюда. Если что не понятно спрашивай smile
--------------------
http://isokolov.blogspot.com/
PM MAIL ICQ   Вверх
Suppir
Дата 15.2.2010, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Массивы хешей и хеши массивов выносят мне голову  smile 


С помощью регулярного выражения мы получаем $1 и $2;

Не знаю как написать на Perl  следующее условие:

Если в хеше $a нет ключа $2,
    то заносим ключ $2 в хеш, и заносим к нему значение $1
Если в хеше $a есть ключ $2, то в его значения добавляем значение $1 (т.е. создается массив в значениях)





PM MAIL   Вверх
fanat1k
Дата 15.2.2010, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Если правильно понял, то надо сделать так, чтобы ключом хеша $a был массив (ссылка на массив) из переменных $1, тогда можно вот так:

push @{ $h->{$2}}, $1

Условие проверять даже не надо. В случае если ключа нету - он создастся и будет указывать на массив из одного элемента, если ключ есть, то к массиву добавиться еще один элемент.
PM MAIL   Вверх
Vaneska
Дата 16.2.2010, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вот разбор списка. А дальше попробуй сам.
Дальше тебе надо пройтись по полученному хешу и выбрать нужные значения.
Код писал прямо сюда. Так что возможны ошибки.
Код

my $list = "
4089149.1000 - рекомендациями
4089149 - письме
4089149 - Письмо
23841197.3 - Законом
23939435.1 - прилагаемому перечню
23962142.112 - Реестр
23962142.112 - Комиссии
10800200.2043 - уплачивают
10800200.28903 - представляют
10800200.3452 - представляют
10800200.90 - статья 90
";

my %hash = ();

for my $line ( split("\n", $list) ) {
    chomp $line;
    $line =~ /^\s+/; $line =~ /\s+$/;

    my ( $key, $value ) = split(/\s*-\s*/, $line);
    $hash{$key} = {} unless exists $hash{$key};
    $hash{$key}->{$value}++;
}


--------------------
http://isokolov.blogspot.com/
PM MAIL ICQ   Вверх
RomanCh
Дата 16.2.2010, 02:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Позвольте внести небольшие поправочки.
1. Регулярки обрезающие пробельные символы в начале/конце строки в коде Vaneska ничего не делали (вероятно забыт s/). Кроме того - вместо 2х можно использовать одну. chomp $line тоже излишен.
2. Можно использовать "самооживление" ссылок на хеш без проверки их существования и создания ссылки на пустой хеш.
Код

my $list = '...наш чудный список...';
my %hash;

for my $line ( split("\n", $list) )
{
    $line =~ s/(^\s+|\s+$)//g;

    my ( $key, $value ) = split(/\s*-\s*/, $line);
    ++$hash{$key}->{$value};
}
# Вывод результата
foreach my $key (sort keys %hash)
{
    print "Key '$key': ";
    foreach my $subkey (sort keys %{$hash{$key}})
    {
        print "'$subkey':$hash{$key}->{$subkey}; ";
    }
    print "\n";
}



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


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

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


 




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


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

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