我在Python中有这个列表:
.error-msg {
color: red;
font-size: 14px;
}
如何获得这样的列表?,将第三个元素与第二个元素和第一个元素相加
[['jhidalgo', 19, u'6,8'],
['jhidalgo', 19, u'5,3'],
['jhidalgo', 20, u'7'],
['jhidalgo', 20, u'0,4'],
['jhidalgo', 20, u'0'],
['jhidalgo', 20, u'1,6'],
['jhidalgo', 21, u'6,9'],
['jhidalgo', 22, u'1,3'],
['jhidalgo', 23, u'6,9'],
['jtern', 19, u'6,9'],
['jtern', 19, u'3,2']
]
我需要通过对[['jhidalgo', 19, u'12,1'],
['jhidalgo', 20, u'9'],
['jhidalgo', 21, u'6,9'],
['jhidalgo', 22, u'1,3'],
['jhidalgo', 23, u'6,9'],
['jtern', 19, u'10,1']
]
和third
元素进行分组来对second
元素求和。
例如,所有first
jhidalgo
...总和为20
答案 0 :(得分:3)
你可以使用pandas,这是一个很棒的python模块进行数据分析。
或者:
# sorting
d = {}
for name, value, amount in l:
if (name, value) not in d:
d[name, value] = 0
d[name, value] += float(amount.replace(',', '.'))
# rewriting list
result = []
for (k, v), a in d.items():
result.append([k, v, str(a).replace('.', ',')])
答案 1 :(得分:3)
假设这些值旨在将逗号解释为小数点,并且要分组的所有值都是连续的,您可以在此处使用itertools.groupby
效果良好:
import itertools
from math import fsum
from operator import itemgetter
mylist = [...]
summed = [(name, num, fsum(float(x.replace(',', '.')) for x in g))
for (name, num), g in itertools.groupby(mylist, key=itemgetter(0, 1))]
如果数据已经按键连续(并且保持顺序没有困难),则使用groupby
是最佳解决方案,但如果要分组的值不是连续的,则可以排序(使用相同的密钥)对于groupby
),例如在使用mylist.sort(key=itemgetter(0, 1))
计算summed
之前运行groupby
,或者为了避免O(n log n)
排序费用,您可以使用dict
(或者为了简单起见,{{1} }})分组非连续组:
defaultdict(float)