#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 — это лучший способ, ИМХО