Python中的求和向量

2024-09-29 01:35:08 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,我正在尝试在下面的输入示例中添加第3列:

输入1:

act hi  1
act bye 2
act ciao    5

输入2:

^{pr2}$

具有以下所需输出:

act-art hi  2
act-art bye 4
act-art kiss    5
act-art ciao    5

下面是我一直在使用的代码。在

def sumVectors(classB_infile, classA_infile, outfile):

    class_dictA = {}

    with open(classA_infile, "rb") as opened_infile_A:
        for line in opened_infile_A:
            items = line.split()
            classA, feat, valuesA = items[:3]
            class_dictA[feat] = float(valuesA)


    class_dictB = {}

    with open(classB_infile, "rb") as opened_infile_B:
        for line in opened_infile_B:
            items = line.split()
            classB, feat, valuesB = items[:3]
            class_dictB[feat] = float(valuesB)


#print classA, classB, feat, sumVectors

####outfile 
    with open(outfile, "wb") as output_file:
        for key in class_dictA:
            if key in class_dictB:
                weight = class_dictA[key] + class_dictB[key]
                #outstring = "\t".join([classA + "-" +  classB, key, str(weight)])
            else:
                weight = class_dictA[key]
                outstring = "\t".join([classA + "-" +  classB, key, str(weight)])
                output_file.write(outstring + "\n")

        for key in class_dictB:
            if key in class_dictA:
                weight = class_dictB[key]
            outstring = "\t".join([classA + "-" + classB, key, str(weight)])
            output_file.write(outstring + "\n")

但是,它给出了以下输出:

act-art stress  5.0
act-art bye 2.0
act-art hi  1.0
act-art kiss    1.0

有没有什么见解可以解释为什么第二列中的值不求和? 谢谢你


Tags: keyinforactinfileclassweightfeat
2条回答

这包含实现所需结果的最简单的修复:

def sumVectors(classB_infile, classA_infile, outfile):
    class_dictA = {}

    with open(classA_infile, "rb") as opened_infile_A:
        for line in opened_infile_A:
            items = line.split()
            classA, feat, valuesA = items[:3]
            class_dictA[feat.strip()] = float(valuesA)


    class_dictB = {}

    with open(classB_infile, "rb") as opened_infile_B:
        for line in opened_infile_B:
            items = line.split()
            classB, feat, valuesB = items[:3]
            class_dictB[feat.strip()] = float(valuesB)

    ####outfile 
    with open(outfile, "wb") as output_file:
        for key in class_dictA:
            if key in class_dictB:
                weight = class_dictA[key] + class_dictB[key]
                outstring = "\t".join([classA + "-" +  classB, key, str(weight)])
            else:
                weight = class_dictA[key]
                outstring = "\t".join([classA + "-" +  classB, key, str(weight)])
            output_file.write(outstring + "\n")

        for key in class_dictB:
            if key not in class_dictA: # if key was in A it was processed already
                weight = class_dictB[key]
                outstring = "\t".join([classA + "-" + classB, key, str(weight)])
                output_file.write(outstring + "\n")

不过,这确实可以简化:

^{pr2}$

我建议使用defaultdict,而不是编写两个循环来实现两个字典的“合并”:

result = collections.defaultdict(float, class_dictA)
for k, v in class_dictB.items(): result[k] += v

这将创建一个新的result字典,它是class_dictA的副本。然后,将class_dictB中的所有值添加到result字典中。如果一个键还不存在,它将被视为具有值(这就是调用float()所做的)。在

相关问题 更多 >