Найти - Пользователи
Полная версия: Как одновременно получить данные из разных “веток” одного словаря?
Начало » Python для новичков » Как одновременно получить данные из разных “веток” одного словаря?
1
TitanFighter
К примеру есть такой словарь:
{'City1': {'www.site1.com':{'Name1':'Address1'},         
                           {'Name2':'Address2'}
          },
          {'www.site2.com':{'Name11':'Address11'},
                           {'Name3':'Address3'}
          },
          {'www.site3.com':{'Name22':'Address22'},
                           {'Name4':'Address4'}
          },
{'City2': { .......},
}

Мне нужно получить одновременно 2 значения, чтобы их отправить в функцию на выполнение.

Для примера:
Получить из site1: Name1 и Address1
Получить из site2: Name11 и Address11
score = compare('Name1 | Address1', ‘Name11 | Address11’)
if score > 70: # do something

повторяем цикл, только уже с site2: Name3 и Address3
потом переходим в site3 и тд. ходим по кругу для каждого site1\Name*

Т.е. сначала мне нужно получить {'City1': {'www.site1.com':{'Name1':'Address1'} - это легко.
Но как одновременно с этого же словаря начать перебирать\получать из каждого site(2\3) каждый Name(11\3\22\4) аля как в цикле for?…
Потом получить {'City1': {'www.site1.com':{'Name2':'Address2'} - что тоже легко, и опять перебрать site(2\3) каждый Name(11\3\22\4)
Потом перейти в City2 и проделать то же самое.
JOHN_16
словарь это не упорядоченная структура. Так как site1 и site2 здесь для примера,а реальные данные будут другими, то такая схема не сработает.
Другое дело OrderedDict из модуля collections, он упорядочен. А раз упорядочен то при условии что значения в него были добавлены в корректном порядке, значит и итерация по ключам такого словаря будет предсказуемая.
Так к примеру если Name3 был добавлен третьим для site1, то он будет в списке ключей словаря с индексом 2. всегда т.е. {..}.keys() == ‘Name3’ и точно также для других site2 3 и тп
py.user.next
TitanFighter
К примеру есть такой словарь:
Это даже не словарь.

TitanFighter
Получить из site1: Name1 и Address1
Получить из site2: Name11 и Address11
score = compare('Name1 | Address1', ‘Name11 | Address11’)
if score > 70: # do something

повторяем цикл, только уже с site2: Name3 и Address3
потом переходим в site3 и тд. ходим по кругу для каждого site1\Name*
Вообще, похоже на неправильно спроектированный алгоритм. Сначала что-то наворотил, а потом пытаешься это разобрать.
TitanFighter
py.user.next
Это даже не словарь.
Хм. Чем не словарь? Не.. Конечно если придираться, то я и сам с вами соглашусь, что не словарь. Но стоит ли придираться?…

py.user.next
Вообще, похоже на неправильно спроектированный алгоритм. Сначала что-то наворотил, а потом пытаешься это разобрать.
Я еще не воротил) Только думаю) По этому наперед спросил, можно ли так сделать)

Но ввиду того, что думаю не в ту сторону, подскажите, как правильно реализовать следующую задачу:
Есть несколько сайтов, с которых парсится информация. К-во сайтов меняется в разное время от 2х до 5.

Со всех сайтов парсится один и тот же вид информации:
Город - Заведение - Адрес - Ссылка_на_заведение.

Есть заведения, которые присутствуют на некоторых сайтах. У меня есть код, который выдает % схожести одного заведения с другим, таким образом я хотел сравнить заведения между собой, чтоб убить дубли и загрузить себе только уникальные заведения. Изначально я предполагал залить всю информацию в 1 словарь с разделением по сайтам, и вытаскивая из этого словаря данные проводить сравнение, но не знал, как это реализовать (собственно по этому и открыл тему). Уже понял что думаю не в том направлении. Подскажите пожалуйста верный путь решения моей задачи.

Спасибо.
Rodegast
В первом приближении я бы делал как-то так:
[
{"url":url, "text":"", "title":"",....},
.....
{"url":url, "text":"", "title":"",....},
]
py.user.next
TitanFighter
Хм. Чем не словарь?
Вот это запусти в интерпретаторе
{'City1': {'www.site1.com':{'Name1':'Address1'},         
                           {'Name2':'Address2'}
          },}

TitanFighter
Но стоит ли придираться?
Если неконкретно спрашиваешь, то и ответ получишь неконкретный. А один неконкретный ответ равен множеству конкретных вариантов.
То есть иными словами, если ты плохо проектируешь задачу, то ты и получаешь множество неправильных решений.

TitanFighter
Есть несколько сайтов, с которых парсится информация. К-во сайтов меняется в разное время от 2х до 5.
Нужно сделать функцию для каждого вида сайта. Один вид - одна функция.

TitanFighter
Со всех сайтов парсится один и тот же вид информации:
Город - Заведение - Адрес - Ссылка_на_заведение.
Нужно сделать сущность “заведение”, в которой будет хранится полученная информация.

У тебя как бы должно быть отдельно и то, и это, потому что с сайтов можно получать не только такую информацию, а заведения можно получать не только с сайтов.

И дальше у тебя должна быть функция, которая выбирает функцию обработки сайта в соответствии с видом сайта и полученную информацию передаёт в объект “заведение” и сохраняет его.

Закачиваешь все заведения, а потом фильтруешь дубликаты. Там может быть миллион заведений, в котором первое и последнее явлются дубликатами. Поэтому в памяти всё хранить - неправильно, а на ходу отбрасывать дубликаты - тоже требует ненужное хранилище для просмотренных.
TitanFighter
py.user.next
Вот это запусти в интерпретаторе
{'City1': {'www.site1.com':{'Name1':'Address1'},
{'Name2':'Address2'}
},}
Таки натупил скобки лишние впихнул. Пора заканчивать с ночной работой.

Хочу уточнить.
py.user.next
Нужно сделать функцию для каждого вида сайта. Один вид - одна функция.
На данный момент у меня реализовано по одной функции для каждого сайта. Вот только про “вид” не уловил. Имеется ввиду тематика сайтов? Кинотеатры, рестораны, клубы и тд?

py.user.next
Нужно сделать сущность “заведение”, в которой будет хранится полученная информация.
Уже сделано.

py.user.next
Закачиваешь все заведения, а потом фильтруешь дубликаты. Там может быть миллион заведений, в котором первое и последнее явлются дубликатами. Поэтому в памяти всё хранить - неправильно, а на ходу отбрасывать дубликаты - тоже требует ненужное хранилище для просмотренных.
Резюмирую: нужно всю информацию со всех сайтов залить в БД и там уже ее проверить на дубли и не нужно заморачиваться с временными\промежуточными хранилищами в виде словарей\списков. Правильно?

Если я правильно понимаю, то почти все, что мне нужно, уже сделано. В БД залита информация с одного сайта. Не решился заливать остальные сайты в БД так как еще не знал, в каком месте делать проверку на дубли. Предполагал проверку делать до добавления в БД, а о том, что стоит ее делать после добавления даже и не думал.
py.user.next
TitanFighter
Вот только про “вид” не уловил. Имеется ввиду тематика сайтов? Кинотеатры, рестораны, клубы и тд?
На одном сайте эта информация хранится в одном виде, на другом сайте эта информация хранится в другом виде. Там возникает соблазн в том, чтобы учесть в одной функции особенности всех сайтов сразу. Вот так нельзя делать. Отдельный сайт должен обрабатываться отдельной функцией, даже если они очень похожи.

TitanFighter
Резюмирую: нужно всю информацию со всех сайтов залить в БД и там уже ее проверить на дубли и не нужно заморачиваться с временными\промежуточными хранилищами в виде словарей\списков. Правильно?
Можно через pickle сохранять их. Главное, чтобы всё в памяти не держать, потому что и сайтов бывает много, и страниц на них. У меня один раз сайт парсился 8 часов без перерыва (а расчитывал я на час-два). Естественно, всё сразу сохранялось на диск, потому что будь оно в памяти, при малейшей ошибке всё бы пропало.

TitanFighter
Предполагал проверку делать до добавления в БД, а о том, что стоит ее делать после добавления даже и не думал.
Делать до добавления - это не очень правильно. Во-первых, дубликаты не всегда есть (лишний анализ), во-вторых, задача удаления дубликатов никак не связана с закачиванием записей. То есть задача закачивания записей - это одна самостоятельная задача, задача удаления дубликатов из записей - это другая самостоятельная задача. Поэтому они должны выполняться по отдельности.
(Где-то у тебя записи будут уже и тебе надо будет просто удалить дубликаты. Если ты смешаешь, то удалить дубликаты не сможешь, потому что для удаления будет требоваться предварительное закачивание.)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB