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