Python, эквивалентный java.util. SortedSet?

Это известная проблема практически во всех разновидностях .NET. Даже если в сообщении об исключении указано «Неверный URI», из трассировки стека вы заметите, что оно генерируется из FormUrlEncodedContent. Таким образом, тело запроса является проблемой.

Один из способов обойти это - использовать Flurl (отказ от ответственности: я автор), чтобы сделать запрос. Я явно исправил эту проблему в реализации Flurl. И в качестве бонуса он значительно очистит ваш код для построения URL и создания контента:

await ConfigurationManager.AppSettings["PardotURI"]
    .AppendPathSegments("email/version/4/do/send/prospect_email", email)
    .SetQueryParams(new {
        user_key = ConfigurationManager.AppSettings["PardotUserKey"],
        pi_key = GetAPIKey() + "&campaign_id=" + GetPardotCampaign("Capis News");
        from_email = ConfigurationManager.AppSettings["FromEmail"],
        from_name = ConfigurationManager.AppSettings["FromName"],
        name = "FlyNews - " + DateTime.Now.ToString("MM/dd/yyy h:mm tt"),
        subject = "CAPIS: Client Holdings News " + DateTime.Today.ToString("MM/dd/yyyy")
    })
    .PostUrlEncodedAsync(new {
        html_content = htmlContent,
        text_content = textContent
    });

21
задан Robert Harvey 24 January 2012 в 22:47
поделиться

5 ответов

Смотрите на B-деревья . Это похоже на Вас, нуждаются в одном из них. Насколько я понял, что Вам нужна структура, которая будет поддерживать относительно дешевую вставку элемента в структуру устройства хранения данных и дешевую операцию сортировки (или даже отсутствие его). Предложения B-деревьев это.

у меня есть опыт с ZODB.BTrees, и они масштабируются к тысячам и миллионам элементов.

12
ответ дан 29 November 2019 в 20:55
поделиться

Можно использовать insort от bisect модуль для вставки новых элементов эффективно в уже отсортированный список:

from bisect import insort

items = [1,5,7,9]
insort(items, 3)
insort(items, 10)

print items # -> [1, 3, 5, 7, 9, 10]

Примечание, которому это непосредственно не соответствует SortedSet, потому что оно использует список. При вставке того же объекта несколько раз, у Вас будут дубликаты в списке.

12
ответ дан 29 November 2019 в 20:55
поделиться

При поиске реализации эффективного контейнерного типа для Python, реализованного с помощью чего-то как сбалансированное дерево поиска (Красно-черное дерево, например) тогда, это не часть стандартной библиотеки.

я смог найти это, хотя:

http://www.brpreiss.com/books/opus7/

исходный код доступен здесь:

http://www.brpreiss.com/books/opus7/public/Opus7-1.0.tar.gz

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

существует PyAVL, который является модулем C, реализовывая дерево AVL.

кроме того, этот поток мог бы быть полезен для Вас. Это содержит много предложений о том, как использовать разделить пополам модуль для улучшения существующего словаря Python, чтобы сделать то, что Вы спрашиваете.

, Конечно, с помощью insort () тот путь был бы довольно дорогим для вставки и удаления, поэтому рассмотрел бы это тщательно для приложения. Реализация соответствующей структуры данных, вероятно, была бы лучшим подходом.

В любом случае, чтобы понять, необходимо ли сохранить структуру данных отсортированной или отсортировать ее, когда Вы выполняете итерации по ней, необходимо будет знать, намереваетесь ли Вы вставить много или выполнить итерации много. Хранение отсортированной структуры данных имеет смысл, если Вы изменяете его содержание относительно нечасто, но выполняете итерации по нему много. С другой стороны, если Вы вводите и удаляете участников все время, но выполняете итерации по набору относительно нечасто, сортируя набор ключей, прежде чем итерация будет быстрее. Нет никакого корректного подхода.

4
ответ дан 29 November 2019 в 20:55
поделиться

Если Вам только нужны ключи и никакое присваиваемое значение, Python предлагает наборы:

s = set(a_list)

for k in sorted(s):
    print k

Однако Вы будете сортировать набор каждый раз, когда Вы делаете это. Если это является слишком много служебным, можно хотеть посмотреть HeapQueues. Они не могут быть столь же изящными и "Pythonic", но возможно они удовлетворяют Вашим потребностям.

3
ответ дан 29 November 2019 в 20:55
поделиться

Есть ли у вас возможность использовать Jython? Я просто упоминаю об этом, потому что использование TreeMap, TreeSet и т. Д. Тривиально. Также, если вы пришли из Java-фона и хотите двигаться в направлении Pythonic, Jython прекрасно подходит для облегчения перехода. Хотя я признаю, что использование TreeSet в этом случае не будет частью такого «перехода».

Для суперпользователей Jython у меня возник вопрос: пакет blist не может быть импортирован, поскольку он использует файл C, который необходимо импортировать. Но было бы какое-то преимущество использования Blist вместо TreeSet? Можем ли мы вообще предположить, что JVM использует алгоритмы, которые по сути такие же хорошие, как и в CPython?

0
ответ дан 29 November 2019 в 20:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: