2013-06-09 2 views
1

В настоящее время я изучаю Python, и мне нужно написать программу, которая определяет слово, которое чаще всего появляется в стихотворении. Проблема, которая беспокоит меня, - это разбор строк стихотворения в единый список, содержащий слова стихотворения. Когда я его решаю, мне не составит труда определить слово, которое появляется чаще всего.Разбор нескольких строк в Python

Я могу получить доступ к строкам стихотворения, вызывая неоднократно называя input(), а последняя строка содержит три символа ###.

Итак, я написал:

while True: 
    y = input() 
    if y == "###": 
    break 
    y = y.lower() 
    y = y.split() 

и для ввода:

Here is a line like sparkling wine 
Line up now behind the cow 
### 

получил результат:

['here', 'is', 'a', 'line', 'like', 'sparkling', 'wine'] 
['line', 'up', 'now', 'behind', 'the', 'cow'] 

Если я пытаюсь вызвать у [0], я получаю:

here 
line 

Как я могу объединить два списка в пределах одной переменной или как я могу назначить каждую строку для переменной?

Подсказка приветствуется. Благодарю.

+2

В общем, повторное использование такого имени переменной ('y' - это строка, нижняя строка и, наконец, список.) - плохая идея, так как это делает ваш код более запутанным. Лучше написать, например, 'inputline = input()', 'if inputline ==" ### ":', 'lowercased = inputline.lower()', 'words = lowercased.split()'. Если вы этого не делаете, вы часто можете обнаружить, что переменная содержит нечто совершенно иное, чем вы думали при сканировании кода. – kampu

+0

Я знаю. Спасибо. Я просто хотел показать результаты печати как можно скорее, не сохраняя исходные строки ввода (переменная y). – Reloader

ответ

5

Вам нужно добавить y в существующем список, используя list.extend():

words = [] 
while True: 
    y = input() 
    if y == "###": 
    break 
    y = y.lower() 
    y = y.split() 
    words.extend(y) 

Теперь words список, содержащий все слова линий открывавших пользователей.

Демо:

>>> words = [] 
>>> while True: 
... y = input() 
... if y == "###": 
...  break 
... y = y.lower() 
... y = y.split() 
... words.extend(y) 
... 
Here is a line like sparkling wine 
Line up now behind the cow 
### 
>>> print(words) 
['here', 'is', 'a', 'line', 'like', 'sparkling', 'wine', 'line', 'up', 'now', 'behind', 'the', 'cow'] 
+0

'append' кажется более подходящим здесь. – Elazar

+3

@ Элазар: Нет, 'y' - список слов. OP хотел * один * список слов, а не список списков. –

+0

ОК, вы правы. – Elazar

3
words = [] 

while True: 
    y = input() 
    if y == "###": 
    break 
    words.extend(y.lower().split()) 

from collections import Counter 
Counter(words).most_common(1) 

Весь этот код может быть сжат в следующий один лайнер:

Counter(y.lower() for x in iter(input, '###') for y in x.split()).most_common(1) 

например.

>>> sys.stdin = StringIO.StringIO("""Here is a line like sparkling wine 
Line up now behind the cow 
###""") 
>>> Counter(y.lower() for x in iter(input, '###') for y in x.split()).most_common(1) 
[('line', 2)] 

По желанию, без каких-либо import s

c = {} # stores counts 
for line in iter(input, '###'): 
    for word in line.lower().split(): 
     c[word] = c.get(word, 0) + 1 # gets count of word or 0 if doesn't exist 

print(max(c, key=c.get)) # gets max key of c, based on val (count) 

Чтобы не сделать второй проход над словарем, чтобы найти максимальное слово, следить за ним, как вы идете по:

c = {} # stores counts 
max_word = None 
for line in iter(input, '###'): 
    for word in line.lower().split(): 
     c[word] = c.get(word, 0) + 1 # gets count of word or 0 if doesn't exist 
     if max_word is None: 
      max_word = word 
     else: 
      max_word = max(max_word, word, key=c.get) # max based on count  

print(max_word) 
+0

IMHO этот код немного отличается от Zen of Python. Я имею в виду, я считаю это классным в каком-то смысле, но это довольно загадочно. Как вы думаете? – whatyouhide

+0

Этот код печатает правильный ответ, но я не должен использовать внешнюю функцию для решения этой проблемы. Только методы str.lower() и str.split(). Можно ли это сделать без импорта функции счетчика? – Reloader

+0

+1 для 'collections.Counter'olution. Можно подумать, что это самая pythonic_ по своей сути, это почти тот же пример, приведенный в [официальной документации для «Counter»] (http://docs.python.org/2/library/collections.html#counter-objects) –

Смежные вопросы