python中的统计打印

时间:2011-12-19 08:16:41

标签: python dictionary

我有一个元组列表,[(falseName, realName, positionOfMistake)]例如:

[('Milter', 'Miller', 4),
 ('Manton','Manson',4), 
 ('Moller', 'Miller', 2)] 

我需要写一个返回的函数:

Miller:
    Milter: 0.50
    Moller: 0.50
Manson:
    Manton: 1.00

我在想:

def nameStatistics(nameList):
    D={}
    for tup in nameList
        if tup[1] not in D:
            D[tup[1]]={}
            if tup[0] not in D[tup[1]]:
                D[tup[1]][tup[0]]=0
            D[tup[1]][tup[0]] += 1
            print tup[1]+":\n\t"+tup[0]

但是我得到了:

  Miller:
        Milter 
  Miller:     
        Moller
  Manson:
        Manton

1 个答案:

答案 0 :(得分:2)

您没有正确构建字典,因为您的缩进在某些地方是错误的。此外,您的print语句不会引用您构建的字典。试试这个:

def nameStatistics(nameList):
    D={}
    for firstName, lastName, unused in nameList:
        if lastName not in D:
            D[lastName]={}
        if firstName not in D[lastName]:
            D[lastName][firstName] = 0
        D[lastName][firstName] += 1
    # only print after all tuples are processed
    for lastName, stats in D.iteritems():
        print lastName + "\n"
        for firstName, frequency in stats.iteritems():
            print "\t{0}:  {1}\n".format(firstName, frequency/float(len(stats)))

您可以使用defaultdict

进一步简化此操作
from collections import defaultdict

def nameStatistics(nameList):
    D = defaultdict(lambda: defaultdict(int))
    for firstName, lastName, unused in nameList:
        D[lastName][firstName] += 1
    # only print after all tuples are processed
    for lastName, stats in D.iteritems():
        print lastName + "\n"
        for firstName, frequency in stats.iteritems():
            print "\t{0}:  {1}\n".format(firstName, frequency/float(len(stats)))