如何在一个循环中打印多个值,键dicts python“?

时间:2018-02-16 13:39:47

标签: python

我正在尝试在一个循环中打印两个值,来自两个不同字典的键,做一些添加*,但我无法在一个循环中一起正确地完成它,我的代码

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 

2 个答案:

答案 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简化代码。将dict1dict2初始化为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只有奔驰。数据是否正确?或者我错过了什么?