Python: функции ключа сортировки объединения itemgetter и str.lower

Для коммерческих инструментов Вы могли бы хотеть попробовать Засыпанный снегом.

http://www.snowbound.com/

Мой опыт с ними несколько датирован, но я нашел их Java API Обработки изображений, чтобы быть намного легче использовать, чем JAI и намного быстрее.

Их поддержка клиентов и примеры кода были очень хороши также.

7
задан SimonSalman 8 September 2009 в 14:56
поделиться

6 ответов

В общем случае вам нужно написать свою функцию извлечения ключей для сортировки; только в особых (хотя и важных) случаях бывает так, что вы можете просто повторно использовать существующий вызываемый объект для извлечения ключей или просто соединить пару уже существующих («быстрым и грязным» способом с использованием лямбда , поскольку нет встроенного способа выполнения композиции функций).

Если вам часто требуется выполнять эти два вида операций для извлечения ключа (получить элемент и вызвать метод для этого элемента), я предлагаю:

def combiner(itemkey, methodname, *a, **k):
  def keyextractor(container):
    item = container[itemkey]
    method = getattr(item, methodname)
    return method(*a, **k)
  return keyextractor

поэтому listofdicts.sort (key = combiner ('name', 'lower')) будет работать в вашем случае.

Обратите внимание, что, хотя чрезмерное обобщение требует затрат, изящное и умеренное обобщение (оставив ключ элемента , имя метода и аргументы метода, если таковые имеются, в зависимости от времени выполнения,

10
ответ дан 6 December 2019 в 04:59
поделиться

Как насчет этого:

list_of_dicts.sort(key=lambda a: a['name'].lower())
14
ответ дан 6 December 2019 в 04:59
поделиться

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

 def compose(inner_func, *outer_funcs):
     if not outer_funcs:
         return inner_func
     outer_func = compose(*outer_funcs)
     return lambda *args, **kwargs: outer_func(inner_func(*args, **kwargs))

 from operator import itemgetter, methodcaller
 name_lowered = compose(itemgetter('name'), methodcaller('lower'))
 print(name_lowered( {'name': 'Foo'} ))

. Если вы поменяете местами определения внутреннего и внешнего в функции compose , вы получите более традиционный b-комбинатор (bluebird). Мне больше нравится q-комбинатор из-за его сходства с конвейерами unix.

4
ответ дан 6 December 2019 в 04:59
поделиться

Как насчет использования переключателей wsdl / server или wsdl / serverinterface ? Насколько я понимаю свойства командной строки wsdl.exe, это именно то, что вам нужно.

- ADVANCED -

/ server

Server switch has been deprecated. Please use /serverInterface instead.
Generate an abstract class for an xml web service implementation using
ASP.NET based on the contracts. The default is to generate client proxy
classes.

С другой стороны: почему вы хотите создавать устаревшие технологические решения? Почему бы не создать эту веб-службу как службу WCF. Это текущий и более современный, гораздо более гибкий способ сделать это!

Marc


ОБНОВЛЕНИЕ:

Когда я использую wsdl / server в файле WSDL, я создаю этот файл:

[WebService(Namespace="http://.......")]
public abstract partial class OneCrmServiceType : System.Web.Services.WebService 
{
    /// <remarks/>
    [WebMethod]
    public abstract void OrderCreated(......);
}

По сути, это практически тот же код, который создается, когда вы добавляете файл ASMX в свое решение (в коде за файлом - yourservice.asmx.cs). Я не думаю, что вы можете приблизиться к созданию файла ASMX из файла WSDL.

Вы всегда можете добавить «yourservice.asmx» вручную - он действительно не содержит много: но модуль локали важен даже для правильного получения одного модуля. Показательный пример: в шведском "V" и "W" сортируются одинаково, поэтому вам нужно сопоставить их. locale сделает все это за вас.). но модуль локали важен даже для правильного получения одного модуля. Показательный пример: в шведском «V» и «W» сортируются одинаково, поэтому вам нужно сопоставить их. locale сделает все это за вас.). В языковом стандарте POSIX (не по умолчанию) это вернется к сортировке «a» после «Z».

4
ответ дан 6 December 2019 в 04:59
поделиться

Лично мне хотелось бы, чтобы в стандартной библиотеке Python было две функции (возможно, в functools ):

def compose(*funcs):
    """
    Compose any number of unary functions into a single unary
    function.

    >>> import textwrap
    >>> str.strip(textwrap.dedent(compose.__doc__)) == compose(str.strip, textwrap.dedent)(compose.__doc__)
    True
    """

    compose_two = lambda f1, f2: lambda v: f1(f2(v))
    return reduce(compose_two, funcs)

def method_caller(method_name, *args, **kwargs):
    """
    Return a function that will call a named method on the
    target object with optional positional and keyword
    arguments.

    >>> lower = method_caller('lower')
    >>> lower('MyString')
    'mystring'
    """
    def call_method(target):
        func = getattr(target, method_name)
        return func(*args, **kwargs)
    return call_method

Я реализовал их для собственного использования в jaraco.util.functools .

В любом случае, теперь ваш код достаточно ясный, самодокументированный и надежный (IMO).

lower = method_caller('lower')
get_name = itemgetter('name')
lowered_name = compose(lower, get_name)

list_of_dicts.sort(key=lowered_name)
4
ответ дан 6 December 2019 в 04:59
поделиться
def lower_getter(field):
    def _getter(obj):
        return obj[field].lower()
    return _getter

list_of_dicts.sort(key=lower_getter(key_field))
2
ответ дан 6 December 2019 в 04:59
поделиться
Другие вопросы по тегам:

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