我正在尝试在一个循环中打印两个值,来自两个不同字典的键,做一些添加*,但我无法在一个循环中一起正确地完成它,我的代码
def code (file):
dict1 = {}
dict2 = {}
f = open('text.txt', 'r')
for line in f.readlines():
line =line.strip()
parts = line.split(" ")
try:
(w1, w2) = [parts[0], parts[1]]
word2 = (wr1+' '+wr2)
# dict2words
if word2 in dict2:
dict2[word2] +=1
else:
dict2 [word2] = 1
#dict1word
if w[1] in dict1:
dict1[w[1]] +=1
else:
dict1[w[1]] = 1
expect:
print ('no word')
code(file)
我的文件看起来像这样
car1 BMW
car2 Benz
Car3 Kia
car1 BMW
car4 BMW
用这个代码计算两个单词一起发生(bigram)和unigram(第二个单词)在不同的dict中像这样
dic2 dic1
Car1 BMW 2 BMW 3
Car2 Benz 1 Benz 1
Car3 kia 1 kia 2
Car4 BMW 1 BMW 3
(bigram car1 bmw发生了两次,Bmw unigram在整个carpus中发生了3次)
我可以单独正确地打印它们,但是无法将它们打印在一起进行这样的计算(代码运行正确,但一起输出错误)
for k, v in sorted(dict1.iteritems()):
print k, v
for k1, v1 in sorted(dict2.iteritems()):
print k1,v1
我的问题是如何以相同的循环/排序顺序同时打印两个键和值以获得此结果
dic2 dic1 result
Car1 BMW 2 BMW 3 2 * 3
Car2 Benz 1 Benz 1 1 * 1
Car3 kia 1 kia 2 1 * 2
Car4 BMW 1 BMW 3 1 * 3
答案 0 :(得分:2)
没有"简单"这样做的方法。
在分割双字母时,您需要应用与应用相同的逻辑。 你需要迭代dict2,为你看到的每个键,拆分它,得到unigram,从dict1算起来。即:
for bigram, bigram_count in dict2.items():
unigram = bigram.split(' ')[-1]
unigram_count = dict1[unigram]
print(bigram, bigram_count, unigram, unigram_count, bigram_count * unigram_count)
Offtopic:您可以使用defaultdict简化代码。将dict1
和dict2
初始化为defaultdict(int)
,您可以跳过if w in dict: ... else: ...
例程
答案 1 :(得分:1)
正如Slam提到使用defauldict,它可以通过以下方式完成。
from collections import defaultdict
def code (file):
dictionary1 = defaultdict(list)
dictionary2 = defaultdict(int)
f = open('text.txt', 'r')
partsarray = []
for line in f.readlines():
line =line.strip()
parts = line.split(" ")
parts.remove('')
partsarray.append(parts)
try:
i=0
for part,partforadding in partsarray:
if(part in dictionary1):
i+=1
dictionary1[part].remove(i)
dictionary1[part].append(i+1)
else:
dictionary1[part].append(partforadding)
dictionary1[part].append(1)
dictionary2[partforadding]+=1
print(dictionary1)
print(dictionary2)
except Exception as error:
print("The error is")
print(error)
print ('no word')
code("text.txt")
输出
defaultdict(<class 'list'>, {'car1': ['BMW', 2], 'car2': ['Benz', 1], 'Car3': ['Kia', 1], 'Car2': ['Kia', 1], 'car4': ['BMW', 1]})
defaultdict(<class 'int'>, {'BMW': 3, 'Benz': 1, 'Kia': 2})
在你提到的档案中,car2同时拥有奔驰和起亚。但在输出中Car2只有奔驰。数据是否正确?或者我错过了什么?