在日期列表中查找重复项

时间:2018-07-22 19:58:25

标签: python python-3.x

我有两个列表:

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中的日期时间值,它们正在变形。有办法避免这种情况吗?

3 个答案:

答案 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]