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

#python-3.x #file-manipulation

#python-3.x #манипулирование файлами

Вопрос:

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

 def BiggestWord():
   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))
   biggest_word = str(max(list_words, key=len))

   print biggest_word
   print len(biggest_words)

   FindWord(biggest_word)

def FindWord(biggest_word):
  

Комментарии:

1. Не могли бы вы уточнить, в чем проблема? Вы пробовали решать это на бумаге, писать псевдокод и т. Д.? Кстати, используете ли вы Python 2?

2. Вы можете использовать index метод списка. list_words.index(largest_word) выдаст индекс самого большого слова, которое является номером строки, когда вы добавляете свое большое слово строки в список.

Ответ №1:

Вам не нужно выполнять еще один цикл по вашему списку самых больших слов из каждой строки. Каждый цикл 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
  

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

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

Комментарии:

1. Спасибо. Я впервые задал здесь вопрос. Я изучаю длину, и это определенно помогло мне понять, как работает enumerate!

Ответ №2:

При ограниченном объеме информации, с которой я работаю, это лучшее решение, которое я мог придумать. Предполагая, что каждая строка разделяется новой строкой, такой как ‘ 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
  

Ответ №3:

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

 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
  

Ответ №4:

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

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

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

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