使用 4300 万行文本文件中的计数创建字典的更简单方法?
A simpler way to create a dictionary with counts from a 43 million row text file?
上下文:我有一个大约有 4400 万行的文件。每个人都是拥有美国地址的个人,因此有一个 "ZIP Code" 字段。文件为 txt,以竖线分隔。
由于大小,我不能(至少在我的机器上)使用 Pandas 来分析。所以我的一个基本问题是:每个不同的邮政编码有多少条记录(行)?我采取了以下步骤,但我想知道是否有更快、更 Pythonic 的方法来执行此操作(似乎有,我只是不知道)。
第 1 步:为来自文件的 ZIP 值创建一组:
output = set()
with open(filename) as f:
for line in f:
output.add(line.split('|')[8] # 9th item in the split string is "ZIP" value
zip_list = list(output) # List is length of 45,292
第 2 步:创建了一个“0”列表,与第一个列表的长度相同:
zero_zip = [0]*len(zip_list)
第 3 步:根据这两个列表创建字典(全为零):
zip_dict = dict(zip(zip_list, zero_zip))
第 4 步:最后我 运行 再次浏览文件,这次更新我刚刚创建的字典:
with open(filename) as f:
next(f) # skip first line, which contains headers
for line in f:
zip_dict[line.split('|')[8]] +=1
我得到了最终结果,但想知道是否有更简单的方法。谢谢大家。
创建 zip_dict
可以替换为 defaultdict
。如果您可以 运行 遍历文件中的每一行,则无需执行两次,只需保持 运行ning 计数即可。
from collections import defaultdict
d = defaultdict(int)
with open(filename) as f:
for line in f:
parts = line.split('|')
d[parts[8]] += 1
这很简单,使用内置计数器 class。
from collections import Counter
with open(filename) as f:
c = Counter(line.split('|')[8] for line in f)
print(c)
上下文:我有一个大约有 4400 万行的文件。每个人都是拥有美国地址的个人,因此有一个 "ZIP Code" 字段。文件为 txt,以竖线分隔。
由于大小,我不能(至少在我的机器上)使用 Pandas 来分析。所以我的一个基本问题是:每个不同的邮政编码有多少条记录(行)?我采取了以下步骤,但我想知道是否有更快、更 Pythonic 的方法来执行此操作(似乎有,我只是不知道)。
第 1 步:为来自文件的 ZIP 值创建一组:
output = set()
with open(filename) as f:
for line in f:
output.add(line.split('|')[8] # 9th item in the split string is "ZIP" value
zip_list = list(output) # List is length of 45,292
第 2 步:创建了一个“0”列表,与第一个列表的长度相同:
zero_zip = [0]*len(zip_list)
第 3 步:根据这两个列表创建字典(全为零):
zip_dict = dict(zip(zip_list, zero_zip))
第 4 步:最后我 运行 再次浏览文件,这次更新我刚刚创建的字典:
with open(filename) as f:
next(f) # skip first line, which contains headers
for line in f:
zip_dict[line.split('|')[8]] +=1
我得到了最终结果,但想知道是否有更简单的方法。谢谢大家。
创建 zip_dict
可以替换为 defaultdict
。如果您可以 运行 遍历文件中的每一行,则无需执行两次,只需保持 运行ning 计数即可。
from collections import defaultdict
d = defaultdict(int)
with open(filename) as f:
for line in f:
parts = line.split('|')
d[parts[8]] += 1
这很简单,使用内置计数器 class。
from collections import Counter
with open(filename) as f:
c = Counter(line.split('|')[8] for line in f)
print(c)