我有一个文件,其中包含一个城市名称,然后是文件中每行的州名称。我假设计算状态名称出现的次数并返回值。
例如,如果我的文件包含:
Los Angeles California
San Diego California
San Francisco California
Albany New York
Buffalo New York
Orlando Florida
我假设返回每个状态名称出现的次数。我有这个给加利福尼亚。
for line in f:
California_count=line.find("California")
if California_count!=-1:
total=line.count("California")
print(total)
这只给了我值 1,我假设这是因为它每行出现 1 次。如何让它返回数字 3 而不是数字 1?
使用字典存储计数器:
data = """Los Angeles California
San Diego California
San Francisco California
Albany New York
Buffalo New York
Orlando Florida""".splitlines()
counters = {}
for line in data:
city, state = line[:14], line[14:]
# city, state = line.split('t') # if separated by tabulator
if state not in counters:
counters[state] = 1
else:
counters[state] += 1
print counters
# {'Florida': 1, 'New York': 2, 'California': 3}
您可以使用collections.defaultdict
来简化它:
from collections import defaultdict
counter = defaultdict(int)
for line in data:
city, state = line[:14], line[14:]
counter[state] += 1
print counter
# defaultdict(<type 'int'>, {'Florida': 1, 'New York': 2, 'California': 3})
或使用collections.Counter
和生成器表达式:
from collections import Counter
states = Counter(line[14:] for line in data)
# Counter({'California': 3, 'New York': 2, 'Florida': 1})
total = 0
with open('input.txt') as f:
for line in f:
found = line.find('California')
if found != -1 and found != 0:
total += 1
print total
输出:
3
,您可以使用re
模块并正则表达式:
import re
states = """
Los Angeles California
San Diego California
San Francisco California
Albany New York
Buffalo New York
Orlando Florida
"""
found = re.findall('[cC]alifornia', states)
total = 0
for i in found:
total += 1
print total
这个常见问题的公认答案涵盖了"bw61293"由于他的文本文件的格式而要求的内容,但并不是所有文本文件的通用解决方案!
他要求"计算一个单词在文件中出现的次数",接受的答案每行只能计算一次单词"加利福尼亚"。因此,如果单词在一行上出现两次,那么它只会计算一次。虽然这确实适用于给定的格式,但说"文件"是否是一本书并不是一个通用的解决方案。
对接受答案的修复如下,即使用 nltk 将行分解为单词列表。唯一的问题是确保在命令提示符中使用" pip install nltk
"pip安装nltk库,请注意它是一个大库。如果你想使用蟒蛇,请使用'conda install -c anaconda nltk
'。我使用推文分词器是因为像"don't
"这样的单词中的撇号会将字符串拆分为一个列表['don', "'t"]
但推文分词器会返回["don't"]
,以及其他原因。我还通过在 .count()
中使用 .lower()
使其不区分大小写。我希望这将帮助那些想要更通用地解决"计算一个单词在文件中出现的次数"问题的人。
我是 StackOverflow 的新手,所以请对我的代码的改进或我为我的第一条评论所写的内容提供反馈!
更新我犯了一个错误,下面现已修复!!(请记住,这是一个不区分大小写的搜索,如果您希望它区分大小写,请从列表理解中删除 .lower()。谢谢。我还承诺在我有足够的时间时不使用 nltk 来回答。
from nltk.tokenize import TweetTokenizer
tknzr = TweetTokenizer()
total = 0
with open('input.txt') as f:
for line in f:
LineList = tknzr.tokenize(line)
LineLower = [x.lower() for x in LineList]
found = LineLower.count('california')
if found != -1 and found != 0:
total += found
print(total)
假设帖子中的空格是制表符,以下代码将为您提供一个字典,其中包含文件中所有状态的计数。
#!/usr/bin/env python3
counts = {}
with open('states.txt', 'r') as statefile:
for i in statefile:
state = i.split('t')[1].rstrip()
if state not in counts:
counts[state] = 0
else:
counts[state] += 1
print(counts)