Вложенный цикл for для просмотра каждой комбинации в текстовом файле

#python

#python

Вопрос:

Ниже приведен код, который у меня есть:

 with open('test.txt') as f:
    for i in f:

        for j in f:

            pw_n= i j
            print(pw_n)
  

Пример данных из test.txt является:

 USA
Canada
Mexico
China
Russia
  

Вывод в данный момент:

 USA
CANADA

USA
MEXICO

USA
China

USA
Russia
  

Вышесказанное великолепно, но я бы хотел, чтобы оно проходило через все итерации. Итак, после завершения работы в США я бы хотел, чтобы он отправился в Канаду, затем в Мексику и т.д. … Например.:

 Canada
USA

Canada
Canada

Canada
Mexico
..........
  

Любая помощь по этому поводу была бы отличной. Я пытался увеличить ‘i’ на 1, но это не сработало.

Спасибо!

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

1. Сначала прочитайте строки файла в списке, затем выполните итерацию по списку.

Ответ №1:

Если вы хотите оставаться как можно ближе к вашему текущему коду, вам следует использовать file.readlines() :

 with open('test.txt') as f:
    lines = f.readlines()
    for i in lines:
        for j in lines:
            pw_n = i   j
            print(pw_n)
  

В качестве дополнения я бы рекомендовал изменить lines = f.readlines() на:

 lines = [x.rstrip('n')   'n' for x in f.readlines()]
  

Такое понимание списка приведет к тому, что все слова будут заканчиваться на 'n' (в вашем файле Russia их нет 'n' в конце, и поэтому на выходе они отображаются по-другому, это исправляет это).

Если вы ищете код получше, вам следует использовать itertools.permutations(iterable, r=None) , где r — количество элементов в комбинациях (в данном случае нам нужно 2)

 from itertools import permutations
with open('test.txt') as f:
    for x, y in permutations(f.readlines(), 2):
        print(x   y)
  

Вы также можете улучшить этот код, добавив:

 for x, y in permutations((x.rstrip('n')   'n' for x in f.readlines()), 2):
  

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

Поскольку вы повторяете каждую перестановку внутри for цикла, вам ни в коем случае не нужно сохранять ее в виде списка, это означает, что вам не нужно сохранять в памяти все перестановки одновременно, вместо этого они вычисляются по мере их использования. То же самое относится и к выражению генератора, вы не сохраняете его в отличие от понимания списка из первого кода.

Ответ №2:

Взгляните на https://docs.python.org/3.4/library/itertools.html#itertools.permutations

 >>> list(permutations(['USA', 'Canada', 'Mexico'], 2)) 
[
    ('USA', 'Canada'), 
    ('USA', 'Mexico'), 
    ('Canada', 'USA'), 
    ('Canada', 'Mexico'), 
    ('Mexico', 'USA'), 
    ('Mexico', 'Canada')
]
  

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

1. Привет @Vince если permutations () работает для приведенного выше списка, почему бы ему не работать для 2000 строк, которые у вас есть?

Ответ №3:

Вот одно из решений

 with open('test.txt') as f:
    lines = f.readlines()

for i, val in enumerate(lines):
    for j in range(i 1, len(lines)):
        print("%s%s" %(val, lines[j]))
    print("")