Как перейти по строкам в открытом текстовом файле на Python (2.72)
У меня есть текстовые файлы с несколькими тысячами слов в них (одно слово в строке). Я написал функцию, которая принимает два слова (строки) и проверяет, является ли одно слово анаграммой другого (это означает, что два слова содержат одинаковые буквы, даже если в разном порядке).
Теперь я хочу просмотреть свой огромный текстовый файл и найти анаграммы. Мой вывод должен быть список, который содержит кортежи из пары слов, которые являются анаграммы.
Проблема в том, что я понятия не имею, как перебирать слова с помощью цикла for / while. Все, что я пробовал, провалилось. (Я знаю, как это сделать, но я недостаточно хорошо знаю Python).
edit # 1: Предполагая, что я хочу перейти от 1 до 100 строк в тексте, а не весь текст, как мне это сделать?
6 ответов
file = 'file.txt'
with open(file, 'r') as f:
for line in f:
pass
Я бы пошел на что-то вроде этого:
wordList = []
anagrams = []
file = StringIO.StringIO(open("file.txt","rb"),dialect=csv.excel) //Using csv.excel as each word is on a different line, so hoping this should work but Im not entirely sure
wordList.extend(wordList)
Список слов теперь должен быть чем-то вроде [Word1, Word2, Word3]
for i in xrange(wordList):
if wordList[i] == wordList[i+1]://Code to analyse anagrams here
anagrams.append(wordList[i])
Я действительно не уверен в этом синтаксисе, я даю вам представление о том, что я буду делать. Хотя кто-то, вероятно, проголосует за этот ответ как заурядный, и вам придется прекратить его, выбрасывая ошибку OutOfBounds, но у меня не было много времени, чтобы написать это!:П
Readlines дает вам список всех слов в файле:
text = open("myfile.txt")
wordlist = text.readlines()
Теперь вам просто нужно сделать цикл for:
for item in wordlist:
anagramfunction()...
В Python Tutorial вы уже рассмотрели:
Альтернативный подход к чтению строк состоит в том, чтобы зациклить объект файла. Это экономит память, быстро и приводит к более простому коду:
for line in f: print line,
Ты можешь использовать itertools.combinations
чтобы получить все комбинации слов:
with open("file.txt") as word_list:
for (word1, word2) in itertools.combinations(word_list, 2):
if anagram(word1, word2):
# do stuff
Полагаю, ваш список слов не такой большой, что не помещается в оперативной памяти. Вот (неоптимизированный) алгоритм, который построил бы список анаграмм (используя биты предыдущих ответов):
def buildAnagramsList(word, wordList):
anagramsList = []
for word2 in wordList:
if areAnagrams(word, word2): #you already have a similar method
list.remove(word2) # Spare some time here by not looking twice for the same anagrams
anagramsList.append(word2)
return anagramsList
file = open("myfile.txt")
words = [s.strip() for s in file.readlines()]
anagramsLists = [buildAnagramsList(word, words) for word in words]
загрузить все слова (строки) в список, в то время как слова находятся в отдельных строках, это можно сделать с помощью
readlines()
(вам придется использоватьstrip()
убрать концы строк):words = [s.strip () для s в f.readlines()]
для каждого слова создайте анаграмму
- использовать список слов
in
оператор для этой анаграммы, чтобы проверить, существует ли анаграмма - если существует, то распечатать