-1

我有一个文本文件。我想从这个文档中编译一个字典(DICT)。字典只能包含所有以大写字母开头的单词。(单词是否在句首无关紧要)

到目前为止,我已经这样做了:顺便说一下,我必须使用for 循环split函数来解决这个问题

DICT = {}

for line in lines: # lines is the text without line breaks 
    words = line.split(" ")
    for word in words:
        if word in DICT:
            DICT[word] += 1
        else:
            DICT[word] = 1

但我想这只会使我的文本中的所有单词都成为字典。

  1. 我如何只选择以大写字母开头的单词?
  2. 如何验证我是否正确制作了字典?
4

3 回答 3

1

使用该s.isupper()方法测试字符串是否为大写。您可以使用索引选择第一个字符。

因此,要测试第一个字符是否为大写,请使用:

if word[0].isupper():

如果您想要一种快速且 Python 的方法,请使用一个collections.Counter()对象进行计数,并在所有空格上拆分以删除换行符:

from collections import Counter

counts = Counter()

for line in lines: # lines is the text without line breaks 
    counts.update(word for word in line.split() if word[0].isupper())

在这里,word.split()没有参数拆分所有空格,删除行首和结尾的任何空格(包括换行符)。

于 2013-10-28T08:41:07.367 回答
0
from itertools import groupby
s = "QWE asd ZXc vvQ QWE"
# extract all the words with capital first letter
caps = [word for word in s.split(" ") if word[0].isupper()]  
# group and count them
caps_counts = {word: len(list(group)) for word, group in groupby(sorted(caps))}

print(caps_counts)

groupby可能比手动循环效率低,因为它需要 sorted iterable 执行排序,并且在手动循环的情况下排序是 O(NlogN) 复杂度,超过 O(N) 复杂度。但是这个变体有点“pythonic”。

于 2013-10-28T08:41:39.997 回答
0

您可以使用isupper提到的函数检查单词是否以大写字母开头,并将其包含在您的if else语句之前。

if word[0].isupper():
    if word in DICT:
        DICT[word] += 1
    else:
        DICT[word] = 1

要验证这一点,您可以使用以下any方法:

any(word[0].islower() for word in DICT.keys())

哪个应该返回False。如果你愿意,你可以利用它。

为了让一切变得更好,你可以使用defaultdict

from collection import defaultdict

DICT = defaultdict(int)
for line in lines:
    words = line.split(" ")
    for word in words:
        if (word in DICT) and (word[0].isupper()):
            DICT[word] += 1
于 2013-10-28T08:57:48.803 回答