как перейти по строкам в открытом текстовом файле на Python (2.72) - PullRequest
2 голосов
/ 25 ноября 2011

У меня есть текстовые файлы с несколькими тысячами слов (одно слово в строке). Я написал функцию, которая принимает два слова (строки) и проверяет, если одно слово является анаграммой другого (это означает, что если два слова содержат одинаковые буквы, даже если в другом порядке).

Теперь я хочу просмотреть огромный текстовый файл и найти анаграммы. Мой вывод должен быть список, который содержит кортежи из пары слов, которые анаграммы.

Проблема в том, что я понятия не имею, как переходить к словам с помощью цикла for / while. Все, что я пробовал, провалилось. (Я знаю, как это сделать, но я недостаточно хорошо знаю Python).

редактирование # 1: Если я хочу перейти по строкам от 1 до 100 вместо всего текста, как мне это сделать?

Ответы [ 6 ]

2 голосов
/ 25 ноября 2011
file = 'file.txt'
with open(file, 'r') as f:
    for line in f:
        pass
0 голосов
/ 25 ноября 2011

Я бы пошел на что-то вроде этого:

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, но у меня не было много времени, чтобы написать это! : P

0 голосов
/ 25 ноября 2011

Полагаю, ваш список слов не такой большой, что не помещается в ОЗУ.Вот (неоптимизированный) алгоритм, который строит список анаграмм (используя биты предыдущих ответов):

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

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

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

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

readlines возвращает вам список всех слов в файле:

text = open("myfile.txt")
wordlist = text.readlines()

Теперь вам просто нужно сделать цикл for:

for item in wordlist:
    anagramfunction()...
0 голосов
/ 25 ноября 2011

В 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
...