#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("")