在Python中解析多行

时间:2013-06-09 08:57:36

标签: python parsing python-3.x

我正在学习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']

如果我试着打电话给y [0],我得到:

here
line

如何在同一个变量中连接两个列表,或者如何将每一行分配给不同的变量?

任何提示都表示赞赏。感谢。

2 个答案:

答案 0 :(得分:5)

您需要使用list.extend()

y添加到现有列表中
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']

答案 1 :(得分: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)