Как перейти по строкам в открытом текстовом файле на 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]
  1. загрузить все слова (строки) в список, в то время как слова находятся в отдельных строках, это можно сделать с помощью readlines() (вам придется использовать strip() убрать концы строк):

    words = [s.strip () для s в f.readlines()]

  2. для каждого слова создайте анаграмму

  3. использовать список слов in оператор для этой анаграммы, чтобы проверить, существует ли анаграмма
  4. если существует, то распечатать
Другие вопросы по тегам