Сортировать список строк естественным образом

То, как вы это делаете, прекрасно. Если у вас было немало вещей, вы могли бы подключиться к новой функции, которая обрабатывает все для вас.

Я замечаю, что в ваших подключенных функциях getValue вы получаете значение прямо от объекта; знаете ли вы, что значение передается как параметр с сигналом valueChanged(int)? Если вы измените функции getValue, чтобы принять дополнительный параметр, вам не нужно будет получать значение непосредственно от объекта. Конечно, вы можете покончить с функцией getValue все вместе и выдать свой оператор печати в вспомогательной функции.

self.connect(self.dial, SIGNAL("valueChanged(int)"), self.dial_value_changed)
self.connect(self.spinbox, SIGNAL("valueChanged(int)"),self.spinbox_value_changed)

def dial_value_changed(self, value):
    self.spinbox.setValue(value)
    self.getValue_dial(value)

def spinbox_value_changed(self, value):
    self.dial.setValue(value)
    self.getValue_spinbox(value)

def getValue_dial(self, value):
        print value

def getValue_spinbox(self, value):
        print value

Кроме того, и это зависит от предпочтения, есть новый стиль для сигналов и слотов , которые могут сделать код немного легче читать. Он изменил бы строки

self.connect(self.dial, SIGNAL("valueChanged(int)"), self.dial_value_changed)
self.connect(self.spinbox, SIGNAL("valueChanged(int)"),self.spinbox_value_changed)

выше на

self.dial.valueChanged.connect(self.dial_value_changed)
self.spinbox.valueChanged.connect(self.spinbox_value_changed)

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

6
задан Baz 18 January 2019 в 09:50
поделиться

3 ответа

Вы можете сделать:

lst = ["A","a","b","B","CC","c"]

result = sorted(lst, key= lambda x: (x.lower(), not x.islower()))
print(result)

Вывод

['a', 'A', 'b', 'B', 'c', 'CC']

ОБНОВЛЕНИЕ

Учитывая новые вы примеры Вы можете использовать следующую клавишу:

lst = ["A", "aA", "aa", "aaa", "aAa", "aaA", "b", "B", "CC", "c"]
result = sorted(lst, key=lambda x: (x.lower(), ''.join(str(c.isupper()) for c in x)))
print(result)

Выходные данные

['A', 'aa', 'aA', 'aaa', 'aaA', 'aAa', 'b', 'B', 'c', 'CC']

Для другого примера (["A","a","aA","aa"]) он дает:

['a', 'A', 'aa', 'aA']
0
ответ дан Daniel Mesejo 18 January 2019 в 09:50
поделиться

Вы можете сделать это следующим образом:

>>> sorted( ("A","a","b","B","CC","c"), key=lambda x: (x.lower() + str(x != x.lower()) ,x) )
['a', 'A', 'b', 'B', 'c', 'CC']

Это работает, сравнивая строчную версию буквы с фактической буквой. Если в нижнем регистре есть совпадение, то str(x != x.lower() будет 0, в противном случае 1.

0
ответ дан BoarGules 18 January 2019 в 09:50
поделиться

Вот один из способов:

sorted( lst, key=lambda x: (x.lower(), *map(str.isupper, x)) )
#['A', 'aa', 'aA', 'aaa', 'aaA', 'aAa', 'b', 'B', 'c', 'CC']

Первая сортировка букв без учета регистра. Затем вызовите str.upper для всех символов каждой строки в качестве второго условия сортировки. Это будет ранжировать строчные буквы первыми для строк одинаковой длины.

Python 2 версия

Приведенный выше синтаксис работает только в python3, но вы можете эквивалентно сделать следующее в python2:

sorted( lst, key=lambda x: ((x.lower(),) + tuple(map(str.isupper, x))) )
0
ответ дан pault 18 January 2019 в 09:50
поделиться
Другие вопросы по тегам:

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