2010-01-07 7 views
1

Я, вероятно, не задал правильные запросы: мне нужно, чтобы значение списка соответствовало любому списку: «обратное» (None,) , но даже с (None,) оно будет соответствовать элементу как None (что я не делаю, т хочет)Список python, который соответствует всем

Дело в том, у меня есть функция работы с: [x for x in my_list if x[field] not in filter_list]

, и я хотел бы, чтобы отфильтровать все или ничего не делая тесты как: if filter_list==(None,): return [] и if filter_list==('*',): return my_list

PS: Я хотел бы упростить мой q uestion приводит к некоторым ошибкам (list идентификатор) или глупое [x for x in x];)


Привет,

мне нужно сделать некоторую фильтрацию со списком понимания в питона.

, если я что-то вроде этого:

[x for x in list if x in (None,)] 

Я избавиться от всех значений, которое отлично

, но я хотел бы иметь то же самое, чтобы соответствовать всему

я могу что-то вроде:

[x for x in list if x not in (None,)] 

но он не будет однородным с остальными

Я пытался кое-что, но, например (True,) матчи только 1

Примечание, чем значения для фильтрации являются числовыми, но если у вас есть что-то родовое (как (None,) не соответствовать ничего), это было бы здорово

Благодаря Луи

+5

'list' является зарезервированным словом, вы не должны использовать его в качестве идентификатора. – 2010-01-07 11:17:53

+0

действительно: это было только для демонстрации: я удалил его в любом случае – Louis

+0

Возможно, вы могли бы опубликовать пример того, что вы хотите? скажем, у вас есть 'my_list = [1, 2, None, 4]' и 'filter_list' = [2]' какой должен быть выход. добавьте свои собственные собственные – SilentGhost

ответ

5

__contains__ является магическим методом, который проверяет, если что-то в последовательности:

class everything(object): 
    def __contains__(self, _): 
     return True   

for x in (1,2,3): 
    print x in everything() 
4

Чем лучше синтаксис будет:

[x for x in lst if x is None] 
[x for x in lst if x is not None] 
+0

plz прочитать перефразирование вопроса – Louis

0

Вам не нужно if, вы можете просто сказать

[x for x in list] 
+0

Как вы можете это называть: >>> l = [Нет, 1, 3] >>> [x for x in l] [Нет, 1, 3] – aatifh

+0

@aatifh: это не синтаксис python – SilentGhost

+0

'if' был потому, что я фильтрую на поле: ti теперь правильно в вопросе – Louis

3

Что вы имеете в виду

Я хотел бы иметь то же самое, чтобы соответствовать все

Вобще

[x for x in list] 

и каждый элемент в list соответствует ,

+0

PLZ прочитать перефразирование вопроса – Louis

0

, но я хотел бы иметь такую ​​же вещи, чтобы соответствовать всем

Чтобы соответствовать все, что вам не нужно, если оператору

[x for x in list1] 

или если вы действительно хотите сделать

[x for x in list1 if x in [x]] 
+0

PLZ прочитать перефразирование вопроса – Louis

0

Ответ на ваш пересмотренный вопрос: список что «соответствует» всем возможным значениям фактически бесконечной длины. Таким образом, вы не можете делать то, что хотите, без теста if. Я полагаю, что ваш аргумент должен быть списком или один из двух значений, представляющие «все» и «NONE» случай:

FILTER_NONE = object() # or [] 
FILTER_ALL = object() 

def filter_func(alist, filter_list): 
    if filter_list is FILTER_ALL: 
     return [] 
    elif filter_list is FILTER_NONE: 
     return alist 
     # or maybe alist[:] # copy the list 
    return [x for x in alist if x not in filter_list] 

Если filter_list велико, то может захотеть заменить последнюю строку на:

filter_set = set(filter_list) 
    return [x for x in alist if x not in filter_set] 

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

3

Вы можете изменить свою программу, чтобы принять объект фильтра, а не список.

Абстрактный базовый фильтр будет иметь matches метод, который возвращает истину, если х * соответствует»

ваших общих фильтров случае будет построен с списком аргументов, и будет фильтровать членство в списке -. В matches функция будет искать список и вернуться true, если аргумент был в списке

Вы также можете иметь два специальных подклассов объекта фильтра:.. нет, и все

Они будут иметь специальные функции соответствия, которые либо всегда возвращаются true (все) или false (нет).

Смежные вопросы