2

在 Python 中,我目前有一个字典(它有一个来自列表中的列表的复合键),当我打印它时,它看起来类似于以下内容:

第一个值是一个数字,第二个值(A 或 B)指的是一个文本值,这些数字是它们出现在该字典派生的原始列表列表中的次数的计数。

我需要的是一种以以下格式打印数据的方法。对于字典中数值的唯一出现(即在本例中为第一个和第三个值),打印出相关的文本值及其计数。所以它看起来像

类型:111 文本计数

       A     4
       B    10

      Total: 14

类型:112 文本计数

       A      3

     Total:   3

我知道当与 If 语句结合使用时,我需要使用某种 while 循环。根据我迄今为止的研究(与迄今为止我所学的 Python 相关),我需要使用 if 语句编写循环以仅打印我想要打印的内容。所以我需要在它们第一次出现时打印新的数值,而不是它们出现的第二次(或第三次或第四次等)。我假设部分执行此操作,我将它们放在一个变量中,然后将它们与当前值进行比较。如果它们相同,我不打印它们,但如果它们不同,我打印旧数值的“总数”,将其添加到总总数中,然后打印新数值。

4

5 回答 5

5

我会使用对象的层次结构而不是一个平面字典,例如字典内的字典、字典内的元组等。

考虑一个在 dict 中包含 dicts 的示例:

data = { 
    '111': {
        'A': 4,
        'B': 10,
    },
    '112': {
        'A': 3
    },
}

现在您可以更轻松地访问内容。例如“111”内的显示属性:

for key in data['111']:
    print "%s\t%s" % (key, data['111'][key])

通过组合两个 for 循环,可以轻松创建所需的输出:

for datatype in data:
    print("Type: %s Text Count" % datatype)
    items = data[datatype]
    total = 0
    for key in items:
        print "%s\t%s" % (key, items[key])
        total += items[key]
    print("Total:\t%s\n" % total)

使用给定的数据运行上述代码将产生以下输出:

Type: 111 Text Count
A       4
B       10
Total:  14

Type: 112 Text Count
A       3
Total:  3
于 2012-10-16T13:28:47.267 回答
3

在我看来,更好的数据结构是:

{111:[('A', 4),('B',10)], 112:[('A': 3)]}

然后你可以轻松地打印字典:

for k,v in d.items():
   print "Type: {0}\t Text Count".format(k)
   for item in v:
       print "\t\t{0}  {1}".format(*v)

要将您的 dict 转换为这种形式,我会使用defaultdict

from collections import defaultdict
d = defaultdict(list)
for k,v in yourdict.items():
    new_key,value0 = (x.strip() for x in k.split(','))
    d[int(new_key)].append((value0,v))
于 2012-10-16T13:28:58.717 回答
3
于 2012-10-16T13:30:49.187 回答
2

您可以使用元组作为键。而不是'111, A'尝试('111', 'A')

它允许您轻松地在字典中循环查找与第一个或第二个键值匹配的内容。就像您所拥有的一样,除了更改密钥:

for row in lists: 
    key = (row[0], row[1])
    if key in dictionary: 
        dictionary[key] += 1 
    else: 
        dictionary[key] = 1

#gives
dictionary = {('111', 'A'): 4, ('111', 'B'):10, ('112', 'A'):4}

现在,您是完全正确的:您需要一个变量来存储总数,您需要遍历字典,并且您需要在循环中使用条件语句。你到底在问什么?

您可以像这样遍历字典:

for k in d:
    print k, d[k]

如果您保留字符串键,则需要从每个键中提取两个值,您可以使用split. (如果您使用元组,则无需执行此步骤):

#with string keys
key_1, key_2 = k.split(',')

您需要测试第一个键值是否与所需的数字匹配,然后您要打印字母和值 d[k],并更新总变量:

if key_1 == desired:
    print key_2, d[k]
    total += d[k]

所以你可以把它放在一起,在这样的函数中:

def f(d, desired):
    total = 0
    for k in d:
        key_1, key_2 = k.split(',')
        if key_1 == desired:
            print key_2, d[k]
            total += d[k]
    print 'total', total

如果您使用元组而不是键,则可以删除拆分步骤,只需使用 k[0] 和 k[1] 即可获得两个值:

def f(d, desired):
    total = 0
    for k in d:
        if k[1] == desired:
            print k[0], d[k]
            total += d[k]

    print 'total', total
于 2012-10-16T13:40:42.693 回答
0

我写了一个简单的函数来打印你想要的。它需要字典作为第一个参数,类型作为 int 作为第二个参数(例如fancy_print({'111, A': 4, '112, A': 3,'111, B': 10}, 111)):

def fancy_print(d, typ):
    res=[]
    for k in d:
        kp=[q.strip() for q in k.split(',')]
        if int(kp[0])==typ:
            res.append((kp[1],d[k]))
    res.sort()
    print('\tType: %d Text Count' % typ)
    for t,n in res:
        print('\t%s\t%2d' % (t, n))
    print()
    print('\tTotal:\t%2d' % sum([n[1] for n in res]))
于 2012-10-16T13:40:15.377 回答