Nice try Yota, but no. |
links = ['http://foo.com/page1', 'http://foo.com/page2', 'http://foo.com/page3', 'http://foo.com/', 'http://blah.org/file0', 'http://blah.org/file1', 'http://foobar.net/some_page', 'http://foobar.net/another_page', 'http://foobar.net/yet_another', 'http://blah.org/file2', 'http://blah.org/file3', 'http://blah.org/file4'] Надо скачать страницы/файлы по этим ссылкам, но не создавая избыточную нагрузку на каждый из хостов, чтобы, так сказать, пройти ниже радара.* Можно ввести паузы между закачками, но это сильно затянет исполнение. Самое простое решение -- отсортировать список так, чтобы хосты чередовались между собой, и последовательные запросы гарантировано приходились на разные хосты. Но как выполнить такую сортировку, не прибегая к громоздким циклам? На помощь приходит модуль itertools. Для начала определим критерий сортировки: нас интересует имя хоста: from urllib.parse import urlparse sort_by_host = lambda url: urlparse(url).netloc Ну, а теперь самое весёлое. Этот код можно легко переписать в однострочник, но, памятуя, что from itertools import groupby, zip_longest # Сортируем по именам хостов. sorted_urls = sorted(links, key=sort_by_host) # Группируем хосты. grouped = [list(group) for _, group in groupby(sorted_urls, key=sort_by_host)] # Сортируем хосты циклически. interleaved = list(zip_longest(*grouped)) # Преобразуем в однородный список без None-элементов. output = [item for group in interleaved for item in group if item is not None] # Полученный результат. for link in output: print(link) # http://blah.org/file0 # http://foo.com/page1 # http://foobar.net/some_page # http://blah.org/file1 # http://foo.com/page2 # http://foobar.net/another_page # http://blah.org/file2 # http://foo.com/page3 # http://foobar.net/yet_another # http://blah.org/file3 # http://foo.com/ # http://blah.org/file4 Для ценителей лаконичности та же функция в одну строку. Ну, или уж как получится. :) output = [i for e in list(zip_longest(*[list(g) for _, g in groupby(sorted(links, key=sort_by_host), key=sort_by_host)])) for i in e if i is not None] * Реальная задача, из которой родился пост, была связана с API некоторого сайта, лимитирующим плотность вызовов, но детали той задачи не столь иллюстративны в рамках краткой заметки. |
Документация на английском и репозиторий Документация на русском Скачать |
Пару лет назад Phymec (a.k.a. Chiaroscuro) обратился с просьбой позаимствовать какой-нибудь из этих панорамных рендеров для одной из его потрясных физических анимаций (сделанных с использованием той самой библиотеки Bullet), на что я, конечно же, с удовольствием согласился. И тут ВНЕЗАПНО... Не перестаю удивляться, насколько мир маленькая деревня. |
|
|
Детективное агентство ********** предлагает Вам информационно-поисковые услуги Сбился со счёта, на сколько статей УК они тут нарекламировали. По ссылке -- убогий сайт-визитка с половиной пустых разделов. Телефоны с московскими номерами, офис -- в Махачкале. |
|
|
|
The quote of the day: I've been told that forensics teams will soon try to analyse SATtva's renders to find finger prints...Jean-Philippe Grimaldi |
По ссылке -- просмотрщик панорам (в версиях для линукса и винды) и картинки в полном разрешении, файло на 30 Мб: energy_panorama.zip (sig) |
|
Утром отправился на избирательный участок. Голосую там далеко не первый раз, членов УИК знаю по крайней мере в лицо, мою семью они тоже знают. Подошёл к члену комиссии, отвечающему за мою территорию, передал ей паспорт, она открыла журнал регистрации избирателей на нужной странице. Она смотрит на страницу, я смотрю на страницу. Смотрим друг на друга: моё имя в журнале зачеркнуто. Похоже, она удивлена не меньше моего. Обращается к председателю, та отвечает: "Вчера вечером звонили из УФМС, потребовали вычекнуть ряд избирателей по причине снятия с регистрации". Спрашиваю с улыбкой, без меня меня женили? Сейчас, говорит, выясним. В паспорте отметка о регистрации стоит, так что явно какое-то расхождение. Председатель куда-то звонит, по-видимому в ТИК, минуту о чём-то разговаривает. Кладёт трубку и обращается к другому члену УИК, ведущей журнал дополнительных избирателей: "Раз отметка о регистрации не погашена, внесите". Интересное дело... Трудно сказать, что больше подействовало: что действительно видим друг друга не первый раз или что на участке четверо или пятеро наблюдателей, чего даже близко не было в декабре (кстати, организация на участке, я бы сказал, образцово-показательная: наблюдатели свободно передвигаются по помещению, контролируют процесс очень тщательно). Так или иначе, свой бюллетень получил, долг перед Родиной выполнил. |
Но самое примечательное, что все смонтрированные видеоролики были распространены с одного сервера, который расположен на территории США в штате Калифорния. ВНЕЗАПНО youtube хостится в Калифорнии? No way! |
|
"Брусничка", Томск "Стройпарк", Томск Томская ТВЗ, ЦИТ Томская ТВЗ, Инженерный центр ЧБ-вариант в порядке эксперимента: ФОК, Кемерово Hilton DoubleTree, Новосибирск |
"Брусничка", Томск Томская ТВЗ, ЦИТ Томская ТВЗ, Инженерный центр ФОК, Кемерово Hilton DoubleTree, Новосибирск "Стройпарк", Томск |
|