Греп по элементам списка
У меня есть список имен файлов:
names = ['aet2000','ppt2000', 'aet2001', 'ppt2001']
Пока я нашел некоторые функции, которые могут работать с grep символьными строками, я не понял, как grep все элементы списка.
например, я хотел бы:
grep(names,'aet')
и получим:
['aet2000','aet2001']
Уверен, что это не слишком сложно, но я новичок в Python
обновить
Этот вопрос, по-видимому, был недостаточно точным. Все приведенные ниже ответы работают для примера, но не для моих фактических данных. Вот мой код, чтобы составить список имен файлов:
years = range(2000,2011)
months = ["jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec"]
variables = ["cwd","ppt","aet","pet","tmn","tmx"] # *variable name* with wildcards
tifnames = list(range(0,(len(years)*len(months)*len(variables)+1) ))
i = 0
for variable in variables:
for year in years:
for month in months:
fullname = str(variable)+str(year)+str(month)+".tif"
tifnames[i] = fullname
i = i+1
Запуск фильтра (lambda x: 'aet' в x, tifnames) или другие ответы возвращаются:
Traceback (most recent call last):
File "<pyshell#89>", line 1, in <module>
func(tifnames,'aet')
File "<pyshell#88>", line 2, in func
return [i for i in l if s in i]
TypeError: argument of type 'int' is not iterable
Несмотря на то, что tifnames - это список строк символов:
type(tifnames[1])
<type 'str'>
Вы, ребята, видите, что здесь происходит? Еще раз спасибо!
Ответы
Ответ 1
Используйте filter()
:
>>> names = ['aet2000','ppt2000', 'aet2001', 'ppt2001']
>>> filter(lambda x:'aet' in x, names)
['aet2000', 'aet2001']
с regex
:
>>> import re
>>> filter(lambda x: re.search(r'aet', x), names)
['aet2000', 'aet2001']
В Python 3 фильтр возвращает итератор, следовательно, для вызова списка list()
.
>>> list(filter(lambda x:'aet' in x, names))
['aet2000', 'aet2001']
else использовать list-comprehension (он будет работать как в Python 2, так и в 3:
>>> [name for name in names if 'aet' in name]
['aet2000', 'aet2001']
Ответ 2
Попробуйте это. Возможно, это не самый "короткий" из всех показанных кодов, но для тех, кто пытается изучить python, я думаю, что он учит больше
names = ['aet2000','ppt2000', 'aet2001', 'ppt2001']
found = []
for name in names:
if 'aet' in name:
found.append(name)
print found
Выход
['aet2000', 'aet2001']
Изменить:
Изменен для создания списка.
См. также:
Как использовать Python, чтобы узнать слова, начинающиеся с гласных в списке?
Ответ 3
>>> names = ['aet2000', 'ppt2000', 'aet2001', 'ppt2001']
>>> def grep(l, s):
... return [i for i in l if s in i]
...
>>> grep(names, 'aet')
['aet2000', 'aet2001']
Версия Regex, ближе к grep, хотя в этом случае не нужна:
>>> def func(l, s):
... return [i for i in l if re.search(s, i)]
...
>>> func(names, r'aet')
['aet2000', 'aet2001']
Ответ 4
Попробуйте заглянуть в модуль pythong, называемый re. Bellow У меня есть реализация функции grep в python, которая использует re. Это поможет вам понять, как работает (конечно, только после того, как вы прочитали о re)
def grep(pattern,word_list):
expr = re.compile(pattern)
return [elem for elem in word_list if expr.match(elem)]
Ответ 5
Вам не нужно предварительно распределять список tifnames
или использовать счетчик для ввода элементов. Просто добавьте данные в список как сгенерированные или используйте понимание списка.
т.е. просто выполните следующее:
import re
years = ['2000','2011']
months = ["jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec"]
variables = ["cwd","ppt","aet","pet","tmn","tmx"] # *variable name* with wildcards
tifnames = []
for variable in variables:
for year in years:
for month in months:
fullname = variable+year+month+".tif"
tifnames.append(fullname)
print tifnames
print '==='
print filter(lambda x: re.search(r'aet',x),tifnames)
Печать
['cwd2000jan.tif', 'cwd2000feb.tif', 'cwd2000mar.tif', 'cwd2000apr.tif', 'cwd2000may.tif', 'cwd2000jun.tif', 'cwd2000jul.tif', 'cwd2000aug.tif', 'cwd2000sep.tif', 'cwd2000oct.tif', 'cwd2000nov.tif', 'cwd2000dec.tif', 'cwd2011jan.tif', 'cwd2011feb.tif', 'cwd2011mar.tif', 'cwd2011apr.tif', 'cwd2011may.tif', 'cwd2011jun.tif', 'cwd2011jul.tif', 'cwd2011aug.tif', 'cwd2011sep.tif', 'cwd2011oct.tif', 'cwd2011nov.tif', 'cwd2011dec.tif', 'ppt2000jan.tif', 'ppt2000feb.tif', 'ppt2000mar.tif', 'ppt2000apr.tif', 'ppt2000may.tif', 'ppt2000jun.tif', 'ppt2000jul.tif', 'ppt2000aug.tif', 'ppt2000sep.tif', 'ppt2000oct.tif', 'ppt2000nov.tif', 'ppt2000dec.tif', 'ppt2011jan.tif', 'ppt2011feb.tif', 'ppt2011mar.tif', 'ppt2011apr.tif', 'ppt2011may.tif', 'ppt2011jun.tif', 'ppt2011jul.tif', 'ppt2011aug.tif', 'ppt2011sep.tif', 'ppt2011oct.tif', 'ppt2011nov.tif', 'ppt2011dec.tif', 'aet2000jan.tif', 'aet2000feb.tif', 'aet2000mar.tif', 'aet2000apr.tif', 'aet2000may.tif', 'aet2000jun.tif', 'aet2000jul.tif', 'aet2000aug.tif', 'aet2000sep.tif', 'aet2000oct.tif', 'aet2000nov.tif', 'aet2000dec.tif', 'aet2011jan.tif', 'aet2011feb.tif', 'aet2011mar.tif', 'aet2011apr.tif', 'aet2011may.tif', 'aet2011jun.tif', 'aet2011jul.tif', 'aet2011aug.tif', 'aet2011sep.tif', 'aet2011oct.tif', 'aet2011nov.tif', 'aet2011dec.tif', 'pet2000jan.tif', 'pet2000feb.tif', 'pet2000mar.tif', 'pet2000apr.tif', 'pet2000may.tif', 'pet2000jun.tif', 'pet2000jul.tif', 'pet2000aug.tif', 'pet2000sep.tif', 'pet2000oct.tif', 'pet2000nov.tif', 'pet2000dec.tif', 'pet2011jan.tif', 'pet2011feb.tif', 'pet2011mar.tif', 'pet2011apr.tif', 'pet2011may.tif', 'pet2011jun.tif', 'pet2011jul.tif', 'pet2011aug.tif', 'pet2011sep.tif', 'pet2011oct.tif', 'pet2011nov.tif', 'pet2011dec.tif', 'tmn2000jan.tif', 'tmn2000feb.tif', 'tmn2000mar.tif', 'tmn2000apr.tif', 'tmn2000may.tif', 'tmn2000jun.tif', 'tmn2000jul.tif', 'tmn2000aug.tif', 'tmn2000sep.tif', 'tmn2000oct.tif', 'tmn2000nov.tif', 'tmn2000dec.tif', 'tmn2011jan.tif', 'tmn2011feb.tif', 'tmn2011mar.tif', 'tmn2011apr.tif', 'tmn2011may.tif', 'tmn2011jun.tif', 'tmn2011jul.tif', 'tmn2011aug.tif', 'tmn2011sep.tif', 'tmn2011oct.tif', 'tmn2011nov.tif', 'tmn2011dec.tif', 'tmx2000jan.tif', 'tmx2000feb.tif', 'tmx2000mar.tif', 'tmx2000apr.tif', 'tmx2000may.tif', 'tmx2000jun.tif', 'tmx2000jul.tif', 'tmx2000aug.tif', 'tmx2000sep.tif', 'tmx2000oct.tif', 'tmx2000nov.tif', 'tmx2000dec.tif', 'tmx2011jan.tif', 'tmx2011feb.tif', 'tmx2011mar.tif', 'tmx2011apr.tif', 'tmx2011may.tif', 'tmx2011jun.tif', 'tmx2011jul.tif', 'tmx2011aug.tif', 'tmx2011sep.tif', 'tmx2011oct.tif', 'tmx2011nov.tif', 'tmx2011dec.tif']
===
['aet2000jan.tif', 'aet2000feb.tif', 'aet2000mar.tif', 'aet2000apr.tif', 'aet2000may.tif', 'aet2000jun.tif', 'aet2000jul.tif', 'aet2000aug.tif', 'aet2000sep.tif', 'aet2000oct.tif', 'aet2000nov.tif', 'aet2000dec.tif', 'aet2011jan.tif', 'aet2011feb.tif', 'aet2011mar.tif', 'aet2011apr.tif', 'aet2011may.tif', 'aet2011jun.tif', 'aet2011jul.tif', 'aet2011aug.tif', 'aet2011sep.tif', 'aet2011oct.tif', 'aet2011nov.tif', 'aet2011dec.tif']
И, в зависимости от того, найдете ли это более читаемым, было бы более идиоматичным Python иметь это:
years = ['2000','2011']
months = ["jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec"]
vars = ["cwd","ppt","aet","pet","tmn","tmx"]
tifnames = [v+y+m+".tif" for y in years for m in months for v in vars]
print tifnames
print '==='
print [e for e in tifnames if re.search(r'aet',e)]
... тот же вывод