То, как вы это делаете, прекрасно. Если у вас было немало вещей, вы могли бы подключиться к новой функции, которая обрабатывает все для вас.
Я замечаю, что в ваших подключенных функциях 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)
. Но для исходного вопроса и для двух вещей, которые вы делаете, я бы просто подключил сигнал дважды чем иметь вспомогательную функцию.
Вы можете сделать:
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']
Вы можете сделать это следующим образом:
>>> 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
.
Вот один из способов:
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))) )