Это происходит потому, что во второй итерации цикла, когда «что-то» установлено как exclude_label
, вы перезаписываете переменную lists_to_filter
.
Однако вы можете сделать это немного более эффективно, используя наборы. Например,
lists_to_filter = [
['a', 'exclude'],
['b']
]
exclude_set = {'exclude', 'something'}
filters_lists = [labels_list for labels_list in lists_to_filter if not set(labels_list).intersection(exclude_set)]
print(filters_lists)
См. tty стандартный модуль. Это позволяет переключаться от значения по умолчанию, ориентированного на строку на (приготовленный) режим в ориентированный на символ (cbreak) режим с tty.setcbreak (sys.stdin). Чтение единственного символа от sys.stdin закончится в следующую нажатую клавишу на клавиатуре (если это сгенерирует код):
import sys
import tty
tty.setcbreak(sys.stdin)
while True:
print ord(sys.stdin.read(1))
Примечание: решением является Unix (включая Linux) только.
Править: В Windows пробуют msvcrt.getche ()/getwche (). / меня нигде не должен пробовать...
Редактирование 2: Используйте win32 консоль API низкого уровня через ctypes.windll (см. пример в ТАК) с ReadConsoleInput
функция. Необходимо отфильтровать нажатия клавиш - e.EventType==KEY_EVENT
и ищите e.Event.KeyEvent.wVirtualKeyCode
значение. Пример приложения (не в Python, только для понимания) может быть найден по http://www.benryves.com/tutorials/?t=winconsole&c=4.
В зависимости от то, что Вы пытаетесь выполнить, возможно, пользуясь библиотекой, такой как pygame, сделало бы то, что Вы хотите. Pygame содержит более усовершенствованную обработку нажатия клавиши, чем обычно доступно со стандартными библиотеками Python.
Если необходимо работать в окнах, только необходимо попробовать msvcrt.
Вероятно, необходимо будет использовать Tkinter, который является 'стандартным' Python gui и много лет включался с Python.
Решение командной строки, вероятно, не доступно из-за способа, которым данные передают в и из процессов командной строки. Программы GUI (некоторой разновидности или другого) все получают ввод данных пользователем через (возможно перенесенная библиотека) поток событий. Каждое событие будет записью деталей события. Для событий нажатия клавиши рекордное желание может содержать любой код клавиши, битовое поле модифицирующей клавиши или текстовый символ в некотором кодировании. Какие поля, и как их называют, зависят от библиотеки события, Вы звоните.
Программы командной строки получают ввод данных пользователем через символьные потоки. Нет никакого способа поймать данные низшего уровня. Как myroslav объясненный в его сообщении, tty's может быть в приготовленном или сыром режиме, при этом единственная разница - это в режиме с обработкой, терминал обработает (немного), управляющие символы для Вас, как удаляют и входят так, чтобы процесс получил строки входа вместо 1 символа за один раз.
Обработка чего-либо ниже, чем это требует (зависимых от операционной системы) системных вызовов или открывающий устройства посимвольного ввода-вывода в/dev. Стандартная библиотека Python не предоставляет стандартного средства для этого.
Очевидный ответ:
someFunction = string.upper
ord('a') != ord('A') # 97 != 65
someFunction('a') == someFunction('A') # a_code == A_code
или, в других (ключевых) словах:
char_from_user = getch().upper() # read a char converting to uppercase
if char == 'Q':
# quit
exit = True # or something
elif char in ['A', 'K']:
do_something()
и т.д...
Вот реализация функции getch, которая работала бы и в Windows и в платформах Linux, на основе этого рецепта:
class _Getch(object):
"""Gets a single character from standard input.
Does not echo to the screen."""
def __init__(self):
try:
self.impl = _GetchWindows()
except ImportError:
self.impl = _GetchUnix()
def __call__(self):
return self.impl()
class _GetchUnix(object):
def __init__(self):
import tty, sys
def __call__(self):
import sys, tty, termios
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
try:
tty.setraw(sys.stdin.fileno())
ch = sys.stdin.read(1)
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
return ch
class _GetchWindows(object):
def __init__(self):
import msvcrt
def __call__(self):
import msvcrt
return msvcrt.getch()
getch = _Getch()