Как я могу напечатать номер строки слова в текстовом файле в python?

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

def LargestWord():
   list_words = []
   with open('song.txt', 'r') as infile:
       lines = infile.read().split()
       for i in lines:
          words = i.split()
          list_words.append(max(words, key=len))
   largest_word = str(max(list_words, key=len))

   print largest_word
   print len(largest_words)

   FindWord(largest_word)

def FindWord(largest_word):

person Guilherme Roque de Souza    schedule 17.10.2020    source источник
comment
Можно поконкретнее в чем дело? Вы пытались решить это на бумаге, написать псевдокод и т. д.? Кстати, вы используете Python 2?   -  person AMC    schedule 17.10.2020
comment
Вы можете использовать index метод списка. list_words.index(largest_word) даст индекс самого большого слова, которое является номером строки, когда вы добавляете свое большое слово строки в список.   -  person LMKR    schedule 17.10.2020


Ответы (4)


Вам не нужно делать еще один цикл по списку самых больших слов из каждой строки. Каждый цикл for увеличивает время и сложность функции, и лучше по возможности избегать ненужных.

В качестве одного из вариантов вы можете использовать встроенную функцию Python enumerate, чтобы получить индекс для каждой строки из списка строк, и вместо того, чтобы добавлять максимум каждой строки в список, вы можете сравнить его с текущим максимальным словом.

def get_largest_word():
    # Setting initial variable values
    current_max_word = ''
    current_max_word_length = 0
    current_max_word_line = None

    with open('song.txt', 'r') as infile:
        lines = infile.read().splitlines()
        for line_index, line in enumerate(lines):
            words = line.split()
            max_word_in_line = max(words, key=len)
            max_word_in_line_length = len(max_word_in_line)
            if max_word_in_line_length > current_max_word_length:
                # updating the largest word value with a new maximum word
                current_max_word = max_word_in_line
                current_max_word_length = max_word_in_line_length
                current_max_word_line = line_index + 1  # line number starting from 1

    print(current_max_word)
    print(current_max_word_length)
    print(current_max_word_line)
    return current_max_word, current_max_word_length, current_max_word_line

P.S.: Эта функция не подсказывает, что делать с максимальным количеством слов одинаковой длины в строке, и какие из них выбрать как абсолютный максимум. Вам нужно будет соответствующим образом скорректировать код.

P.P.S.: Этот пример написан на Python 3, поэтому при необходимости измените фрагмент, чтобы он работал на Python 2.7.

person Inna Zhurba    schedule 17.10.2020
comment
Спасибо. Это был мой первый раз, когда я задавал вопрос здесь. Я изучаю язык, и это определенно помогло мне понять, как работает enumerate! - person Guilherme Roque de Souza; 18.10.2020

С ограниченным объемом информации, с которой я работаю, это лучшее решение, которое я мог придумать. Предполагая, что каждая строка отделена новой строкой, например '\n', вы можете сделать:

def FindWord(largest_word):
   with open('song.txt', 'r') as infile:
      lines = infile.read().splitlines()

   linecounter = 1
   for i in lines:
      if largest_word in lines:
         return linecounter
      linecounter += 1
person Kevin Wang    schedule 17.10.2020

Знаете ли вы, что могут быть:

  • много «самых больших» слов одинаковой длины
  • несколько строк содержат слово (слова) наибольшей длины

Вот код, который находит ОДНО самое большое слово и возвращает СПИСОК номеров строк, содержащих это слово:

# built a dictionary: 
#   line_num: largest_word_in_this_line
#   line_num: largest_word_in_this_line
#   etc...
# !!! actually, a line can contain several largest words
list_words = {} 
with open('song.txt', 'r') as infile:
    for i, line in enumerate(infile.read().splitlines()):
        list_words[i] = max(line.split(), key=len)

# get the largest word from values of the dictionary
# !!! there can be several different 'largest' words with the same length
largest_word = max(list_words.values(), key=len) 

# get a list of numbers of lines (keys of the dictionary) that contain the largest word
lines = list(filter(lambda key: list_words[key] == largest_word, list_words))

print(lines)

Если вы хотите получить все строки со словами одинаковой длины, вам нужно изменить последние две строки в моем коде следующим образом:

lines = list(filter(lambda key: len(list_words[key]) == len(largest_word), list_words))

print(lines)
person Yuri Khristich    schedule 17.10.2020

Вы можете использовать enumerate в for, чтобы получить текущую строку, и sorted с помощью лямбда, чтобы получить самое длинное слово:

def longest_word_from_file(filename):
    list_words = []
    with open(filename, 'r') as input_file:
        for index, line in enumerate(input_file):
            words = line.split()
            list_words.append((max(words, key=len), index))
    
    sorted_words = sorted(list_words, key=lambda x: -len(x[0]))
    longest_word, line_index = sorted_words[0]

    return longest_word, line_index
person Gleison    schedule 17.10.2020