Вы правы в том, что код помещает пользовательский интерфейс в режим сна. Поскольку sleep
вызывается в Thread Dispatch Thread (поток, ответственный за запуск gui), пользовательский интерфейс останавливает обработку событий и «переходит в режим сна».
Я думаю, что вы хотите javax.swing.Timer
.
Timer t = new Timer(1000 * 5, new ActionListener() {
public void actionPerformed(ActionEvent e) {
// do your reoccuring task
}
});
Это приведет к тому, что ваша повторная задача будет выполнена вне EDT, и, следовательно, она не оставит ваш ui невосприимчивым.
Вы можете сделать что-то вроде этого:
from collections import Counter
word_list = ["capital", "Capital", "Capital", "Capital", "capital", "bus", "Bus", "bus", "Bus", "white"]
# count them all while ignoring case
count = Counter(x.lower() for x in word_list)
# count only the title-case ones
uppers = Counter(x.lower() for x in word_list if x[0].isupper())
# get frequency
res = {k.capitalize(): uppers.get(k, 0)/v for k, v in count.items()}
, что приведет к желаемому:
print(res) # -> {'Capital': 0.6, 'Bus': 0.5, 'White': 0.0}
itertools.groupby
Предполагая, что, как в вашем примере, ваши строки отсортированы, вы можете использовать groupby
с statistics.mean
:
from itertools import groupby
from statistics import mean
grouper = groupby(word_list, key=str.casefold)
res = {k.capitalize(): mean(x[0].isupper() for x in words) for k, words in grouper}
# {'Bus': 0.5, 'Capital': 0.6, 'White': 0}
sorted
+ groupby
В этом случае вы можете отсортировать перед , применяя приведенную выше логику:
word_list = sorted(word_list, key=str.casefold)
Это добавляет сложности алгоритму, если ваш список не отсортирован.
collections.defaultdict
Альтернативой является создание словаря со списками логических значений через collections.defaultdict
, затем используйте statistics.mean
: