我有一些问题困扰了我的初学者对python的了解,我希望有人可以指出我正确的方向。
我生成了一个嵌套列表,每个嵌套列表包含两个(对不起,伙计,我的错!)值,如:
[[1, 0],[1, 2],[2, 9],[3, 0],[3, 8],[3, 1]]
第一个值总是指定一天,第二个值总是我实际感兴趣的值。但我需要总结在给定日期发生的所有这些第二个值,如: 例如第1天0 + 2,第2天9,第3天0 + 8 + 1
并生成一个实际上看起来像[[1,2][2,9][3,9]]
的列表,每个第一个值给出我总结的日期,第二个值作为当天所有值的总和。
我知道这是一个非常基本的问题,我知道如何解决这个问题。 gawk或fortran,但我想学习如何以pythonic的方式做到这一点。我查看了使用zip / map但我不知道如何为这个特定问题设置它。我希望有人可以指出我正确的方向
答案 0 :(得分:2)
您可以将密钥放在字典中并将计数存储在值中。像这样:
#!/usr/bin/python
# -*- coding: utf-8 -*-
a = [[1, 0],[1, 2],[2, 9],[3, 0],[3, 8],[3, 1]]
res = {}
for i in a:
if i[0] in res:
res[i[0]] += i[1]
else:
res[i[0]] = i[1]
print res
输出:
{1: 2, 2: 9, 3: 9}
此输出采用字典格式。您可以根据需要将其转换为列表格式。
答案 1 :(得分:1)
这样的问题需要itertools.groupby。特别是groupby,将具有相同键的连续值分组,其中键可以由用户指定。然而,在这种情况下,密钥作为索引列表的特定元素是微不足道的,因此这应该是足以使用operator.itemgetter的理由。最后,您可以根据自己的品味和选择将其包装为功能(使用map / imap)或生成器表达式。
>>> from itertools import groupby, imap
>>> from operator import itemgetter
>>> lst=[[1, 0],[1, 2],[2, 9],[3, 0],[3, 8],[3, 1]]
>>> [[k, sum(imap(itemgetter(1), v))]
for k, v in groupby(lst,key = itemgetter(0))]
[[1, 2], [2, 9], [3, 9]]
答案 2 :(得分:0)
这是m170897017技术的变体:
a = [[1, 0],[1, 2],[2, 9],[3, 0],[3, 8],[3, 1]]
result = {}
for day, val in a:
if day not in result:
result[day] = 0
result[day] += val
print result
#Convert back into a list
print [list(t) for t in result.items()]
<强>输出强>
{1: 2, 2: 9, 3: 9}
[[1, 2], [2, 9], [3, 9]]
如果您使用的是Python 2.7或更高版本,则还可以使用Counter。
另一种可能性是使用defaultdict,这是自Python 2.5以来一直可用的。
from collections import defaultdict
a = [[1, 0],[1, 2],[2, 9],[3, 0],[3, 8],[3, 1]]
result = defaultdict(int)
for day, val in a:
result[day] += val
print [list(t) for t in result.items()]
<强>输出强>
[[1, 2], [2, 9], [3, 9]]
答案 3 :(得分:0)
您可以尝试使用defaultdict ...
from collections import defaultdict
dat = [[1, 0],[1, 2],[2, 9],[3, 0],[3, 8],[3, 1]]
d = defaultdict(int)
for k,v in dat: d[k] += v
答案 4 :(得分:0)
您可以使用collections.OrderedDict
映射items
列出:
l = [[1, 0],[1, 2],[2, 9],[3, 0],[3, 8],[3, 1]]
from collections import OrderedDict
d = OrderedDict()
for a, b in l:
d.setdefault(a, 0)
d[a] += b
print(map(list,d.iteritems()))
[[1, 2], [2, 9], [3, 9]]