Лучше писать код вместо 2 для циклов

У меня есть 2 для циклов, и я хочу сделать это лучше, как понимание списка или лямбда или другое. как я могу достичь того же?

например:

filename = ['a.txt', 'b.txt', 'c.txt']
for files in filename:
    for f in glob.glob(os.path.join(source_path, files)):
        print f
        ... some processing...

Ответы

Ответ 1

Ваш код в порядке. Вы можете сделать это менее разборчивым, вводя ненужные сложные конструкции.

Ответ 2

Вы можете сжать две петли for в одно выражение , с новым циклом for, чтобы извлечь имена файлов от него.

for f in (f_ for files in filename
             for f_ in glob.glob(os.path.join(source_path, files))):
    print f
    # ...

Как сказал другой ответ, это не, это хуже, и вы не должны использовать его (я не уверенный, что достаточно внимания!). Намного сложнее понять, что происходит, и, вероятно, имеет небольшое преимущество в производительности (на самом деле, дополнительные слои косвенности означают, что он, вероятно, будет медленнее).

(* в основном эквивалентно пониманию списка, но лучше в таких ситуациях.)

Ответ 3

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

Если ваша система немного экзотична (например, распределенный сетевой диск), линия с glob и os.path.join является неприятной строкой. Хотя, как говорили другие, две петли в норме.

filename = ['a.txt', 'b.txt', 'c.txt']

searchPatterns = [os.path.join(source_path, files) for files in filename]

searchResults = [glob.glob(pattern) for pattern in searchPatterns]

fileListFlat = sum(searchResults,[])

for file in fileListFlat:
    print file

Ответ 4

Длительное выражение трудно читать, когда вам нужно сканировать вправо и назад. это еще хуже, когда есть много локальных переменных, лямбдов и понятий, просто разделенных паранами и запятыми, в нескольких строках. Используйте их только в том случае, если ваш код не становится длиннее и сложнее. Для случая, я предпочитаю извлекать find как компромисс. Но, как сказал верхний ответ, ваш код достаточно хорош.

from itertools import chain

find = lambda p: glob.glob(os.path.join(source_path, p))
for file in chain(map(find, filename)):
    """
    =) I like one-level indentation here.
    =( I don't know which file pattern is used currently,
       unless I use longer expression...
    """