Эффективный способ поиска элемента в списке Python? - PullRequest
1 голос
/ 03 ноября 2010

У меня есть список файлов в каталоге.Я должен обрабатывать только определенные файлы из этого каталога.список файлов мой желаемый список файлов.Как мне добиться этого?Не заинтересован в решении bash, так как я должен сделать все это в одном скрипте Python.Большое спасибо!

for record in result:
    filelist.append(record[0])

print filelist


for file in os.listdir(sys.argv[1].strip() + "/"):
    for file in filelist: #This doesn't work, how else do I do this? If file equals to my desired file-list, then do something.
        print file

Извините, ребята, не знаю, как я это пропустил!Я думаю, рано утром кодирование !!Моды, пожалуйста, закройте его, если кто-то не хочет использовать эффективный способ сделать это.

for file in os.listdir(sys.argv[1].strip() + "/"):
    if file in filelist:
        print file

Ответы [ 4 ]

3 голосов
/ 03 ноября 2010

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

import set
os_list = os.listdir(sys.argv[1].strip() + "/")
for file in set(os_list) & set(filelist):
    #...

Пример улучшения:

import random
import timeit

l = [random.randint(1,10000) for i in range(1000)]
l2 = [random.randint(1,10000) for i in range(1000)]

def f1():
    l3 = []
    for i in l:
        if i in l2:
            l3.append(i)
    return l3

def f2():
    l3 = []
    for i in set(l) & set(l2):
        l3.append(i)
    return l3

t1 = timeit.Timer('f1()', 'from __main__ import f1')
print t1.timeit(100) #2.0850549985

t2 = timeit.Timer('f2()', 'from __main__ import f2')
print t2.timeit(100) #0.0162533142857
3 голосов
/ 03 ноября 2010

Похоже, вы хотите сделать тест:

for file in os.listdir(sys.argv[1].strip() + "/"):
    if file in filelist:
        # Found a file in the wanted-list.
        print file
1 голос
/ 03 ноября 2010

Примерно так:

print [x for x in os.listdir(sys.argv[1].strip() + "/") if x in filelist]
1 голос
/ 03 ноября 2010

Похоже, вы просто хотите сделать что-то вроде этого:

for file in os.listdir(sys.argv[1].strip() + "/"): 
    if file in filelist:
        print file 

Обратите внимание, что я только что изменил второй for на if.Однако, поскольку вы спрашивали об эффективности, вы, вероятно, захотите изменить filelist с list на set или dict, чтобы сделать оператор in более эффективным.

...