我有两个列表:
x = ['2018-07-22 21:59:12.211654', '2018-07-22 22:00:12.211654',
'2018-07-22 22:01:12.211654', '2018-07-22 22:00:12.211654',
'2018-07-22 22:01:12.211654']
y = [36.37, 38.19, 40.01, 2.50, 8.99]
,并且我尝试在列表x中查找重复项,如果有重复项,则将值与列表y中找到的重复项索引求和。然后擦除。我发现以下代码:
for i in range(len(x)):
for j in range(i + 1, len(x)):
if y[i] == y[j]:
try:
x[i] += x[j]
x[j] = None
y[j] = None
except:
pass
x = [a for a in x if a != None]
y = [a for a in y if a != None]
问题在于列表x中的日期时间值,它们正在变形。有办法避免这种情况吗?
答案 0 :(得分:1)
您可以将两个列表与zip
合并为元组列表,对列表进行排序并按第一个元素(时间)将其分组,然后将sum
应用于第二个元素:
from itertools import groupby
grouped_list = groupby(sorted(zip(x,y)), key=lambda x:x[0])
new_list = [(date, sum(val for _,val in vals))
for date,vals in grouped_list]
结果是元组的汇总列表:
#[('2018-07-22 21:59:12.211654', 36.37),
# ('2018-07-22 22:00:12.211654', 40.69),
# ('2018-07-22 22:01:12.211654', 49.0)]
您可以将此新列表再次拆分为x和y:
x_new, y_new = zip(*new_list)
答案 1 :(得分:0)
您可以简单地使用字典。
输入:
x = ['2018-07-22 21:59:12.211654', '2018-07-22 22:00:12.211654',
'2018-07-22 22:01:12.211654', '2018-07-22 22:00:12.211654',
'2018-07-22 22:01:12.211654']
y = [36.37, 38.19, 40.01, 2.50, 8.99]
D = {}
for index,date in enumerate(x):
if date in D.keys():
D[date] += y[index]
else:
D[date] = y[index]
结果:
>>> list(D.items())
[('2018-07-22 21:59:12.211654', 36.37),
('2018-07-22 22:00:12.211654', 40.69), ('2018-07-22 22:01:12.211654', 49.0)]
>>> x_new,y_new = zip(*list(D.items()))
>>> x_new
('2018-07-22 21:59:12.211654', '2018-07-22 22:00:12.211654', '2018-07-22 22:01:12.211654')
>>> y_new
(36.37, 40.69, 49.0)
答案 2 :(得分:0)
您可以将collections.defaultdict
用于O(n)解决方案:
from collections import defaultdict
d = defaultdict(float)
for date, num in zip(x, y):
d[date] += num
结果:
print(d)
defaultdict(float,
{'2018-07-22 21:59:12.211654': 36.37,
'2018-07-22 22:00:12.211654': 40.69,
'2018-07-22 22:01:12.211654': 49.0})
如果您需要列表,则可以将zip
用于解包(如果元组足够,请忽略map(list, ...)
)
dates, values = map(list, zip(*d.items()))
print(dates, values, sep='\n')
['2018-07-22 21:59:12.211654', '2018-07-22 22:00:12.211654', '2018-07-22 22:01:12.211654']
[36.37, 40.69, 49.0]