Список Python с функцией фильтрации (excel-way)

#python #list #python-2.7 #python-3.x #filtering

#python #Список #python-2.7 #python-3.x #фильтрация

Вопрос:

У меня есть список Python:

 listx = [["a", 127, "Blue", 0],
         ["b", 127, "Red", 1],
         ["b", 127, "Green", 0],
         ["b", 99, "Green", 1],
         ["c", 99, "Yellow", 0]]
  

Это представление таблицы для лучшего понимания ситуации:

Это табличное представление

Я хочу выполнить некоторую функцию фильтра. Например; Я хочу получить список с индексом 0 = «b» и индексом 1 = 127. Таким образом, результаты должны быть:

 listxnew = [["b", 127, "Red", 1],
            ["b", 127, "Green", 0]]
  

Просмотр таблицы для listxnew, чтобы лучше понять ситуацию:

введите описание изображения здесь

Итак, как я могу сделать это с помощью простого кода Python? Спасибо.

Ответ №1:

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

 listxnew = [i for i in listx if i[0:2]==['b', 127]]

>>> print listxnew
[['b', 127, 'Red', 1]
 ['b', 127, 'Green', 0]]
  

Комментарии:

1. Это не тот способ, который я хочу. Любой def, функция или что-то в этом роде? Я буду использовать это для графического интерфейса. Таким образом, объектов, которые можно отфильтровать, может быть больше двух, трех или только одного.

2. @user3051668, я не совсем уверен, что вы имеете в виду, но вы можете легко извлечь def из приведенного выше кода. Извините

3. @user3051668 — Проверьте, работает ли мой ответ? Мне любопытно, это то, что вы ищете.

4. Это работает, но я не хочу писать разные коды для разных фильтров. Если я хочу фильтровать с индексом 0 и индексом 2, это будет другое понимание списка.

5. @user3051668 Вы могли бы легко поместить представление списка в функцию и использовать его на основе определенных входных данных (например, индексов, которые вы хотите проверить, и их желаемого значения)

Ответ №2:

Вот простое решение, которое легко расширяется:

 def filterls(ls, opts):
    """
    ls - list
    opts - dict - {id: match_info}
    """
    results = []
    for l in ls:
        for (i, t) in opts.items():
            if l[i] != t:
                break
        else:
            results.append(l)
    return results
  

Для вашего примера:

 listx = [["a", 127, "Blue", 0],
         ["b", 127, "Red", 1],
         ["b", 127, "Green", 0],
         ["b", 99, "Green", 1],
         ["c", 99, "Yellow", 0]]

print filterls(listx, {0: 'b', 1: 127})
# [['b', 127, 'Red', 1], ['b', 127, 'Green', 0]]
  

Комментарии:

1. Я думаю, что это только для Python 2.7. Я получил это с помощью Python 3.4: AttributeError: объект ‘dict’ не имеет атрибута ‘viewitems’

2. @user3051668 — Да, в python 3.4 viewitems — это просто элементы. Отредактировано.

Ответ №3:

 listx = [["a", 127, "Blue", 0],
         ["b", 127, "Red", 1],
         ["b", 127, "Green", 0],
         ["b", 99, "Green", 1],
         ["c", 99, "Yellow", 0]]

listnew = filter(lambda x: x[0]=='b' and x[1]==127,listx)

print listnew
  

попробуйте использовать Filter

Комментарии:

1. распечатка listnew дает мне <объект фильтра в 0x0345DCF0>, я что-то упускаю?

2. @user3051668 нет, он печатает отфильтрованный список

3. Я думаю, @sundarnatarajСундар OP использует Python 3.x.

4. @user3051668: просто поместите list(listnew) , чтобы посмотреть, какой фильтр создается в Python 3.x. 1 — это лучший способ, ИМХО