给定名称的列表中相关数字的总和

2024-09-27 07:27:28 发布

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

我有一本列表字典:

d = {'a': ['Adam', 'Book', 4], 'b': ['Bill', 'TV', 6, 'Jill', 'Sports', 1, 'Bill', 'Computer', 5], 'c': ['Bill', 'Sports', 3], 'd': ['Quin', 'Computer', 3, 'Adam', 'TV', 3], 'e': ['Quin', 'TV', 2, 'Quin', 'Book', 5], 'f': ['Adam', 'Computer', 7]}

每个列表表示用户使用给定对象的次数。例如,对于列表'a',它显示Adam每周读取Book4次。在“b”中,Bill每周观看TV6次,Jill每周播放sports次。你知道吗

我想在每个列表中找出一个人做某事的总次数。你知道吗

在本例中,输出如下:

a: Adam 4
b: Bill 11, Jill 1
c: Bill 3
d: Quin 3, Adam 3
e: Quin 7
f: Adam 7

不一定是那种精确的格式,但是类似的。你知道吗

目前,我尝试使用Counter,但它只计算人名,而不计算与之相关的数字。我试过只返回名字和数字,但对于超过1个名字的列表来说,这并不管用,因为有些列表甚至总共有6个名字。你知道吗

感谢您的帮助!谢谢您!你知道吗


Tags: 对象用户列表字典数字tv名字次数
3条回答

如果您真的想对数据结构执行此操作,可以执行以下操作:

from collections import defaultdict

for k, lst in d.iteritems():
    counts = defaultdict(int)
    for i in range(0, len(lst), 3):
        counts[lst[i]] += lst[i + 2]
    print k, ", ".join(["%s %d" % (n, c) for n, c in counts.items()])

然而,更好的办法是将数据存储在合理的数据结构中。在列表中存储信息的规则类似于“每个列表以三个一组的形式出现,每三个列表中的第一个是名称等”,这使得处理数据变得笨拙和违反直觉。相反,如果您将数据存储为:

d = {'a': {'Adam': {'Book': 4}},
     'b': {'Bill': {'TV': 6, 'Computer': 5}, 'Jill': {'Sports': 1}},
     'c': {'Bill': {'Sports': 3}},
     'd': {'Quin': {'Computer': 3}, 'Adam': {'TV': 3}},
     'e': {'Quin': {'TV': 2, 'Book': 5}},
     'f': {'Adam': {'Computer': 7}}}

然后,你可以这样回答问题:

for k, v in d.items():
    print k, ", ".join(["%s %d" % (n, sum(a.values())) for n, a in v.items()])

这也有许多其他好处:你可以通过做d["a"]["Adam"]["Book"](或者,如果你不确定“亚当”或“书”在那里,d["a"].get("Adam", {}).get("Book", 0))来找出亚当在“a”中读了多少遍书。根据这一清单进行的其他计算也是可能和有用的。你知道吗

我认为defaultdict和列表切片在这里很有用。。。你知道吗

a = ['Adam', 'TV', 4, 'Adam', 'Bike', 4 ]
print a[::3] # ['Adam', 'Adam' ]
print a[2::3] # [4, 4]

from collections import defaultdict
for key,value in d.items():
    c = defaultdict(int)
    for k,v in zip(value[::3],value[2::3]):
        c[k] += v
    print key, c

一个Counter也可以工作,但是它直到python2.7才被引入,而defaultdict是python2.5兼容的,并且在这个实例中提供相同的功能。你知道吗

尽管如其他人所说,这似乎是一个非常奇怪的数据结构,您正在使用。。。你知道吗

这将产生所需的结果:

import collections
for k, v in sorted(d.iteritems()):
        tmp=collections.defaultdict(int)
        for i in xrange(0, len(v), 3):
                tmp[v[i]]+=v[i+2]
        print "{}: {}".format(k,
                ", ".join("%s %s" % (a, b)
                        for a, b in sorted(tmp.iteritems())))

输出:

a: Adam 4
b: Bill 11, Jill 1
c: Bill 3
d: Adam 3, Quin 3
e: Quin 7
f: Adam 7

相关问题 更多 >

    热门问题