基于同一时间的Python减去数组

时间:2015-08-25 02:27:23

标签: python arrays numpy

有没有办法可以减去两个数组,但确保我减去具有相同日,小时,年份或分钟值的元素?

list1 = [[10, '2013-06-18'],[20, '2013-06-19'], [50, '2013-06-23'], [15, '2013-06-30']]
list2 = [[5, '2013-06-18'], [5, '2013-06-23'] [20, '2013-06-25'], [20, '2013-06-30']]

寻找:

 list1-list2 = [[5, '2013-06-18'], [45, '2013-06-23'] [10, '2013-06-30']]

2 个答案:

答案 0 :(得分:1)

如何使用defaultdict列表?

import itertools
from operator import sub
from collections import defaultdict

def subtract_lists(l1, l2):
    data = defaultdict(list)
    for sublist in itertools.chain(l1, l2):
        value, date = sublist
        data[date].append(value)
    return [(reduce(sub, v), k) for k, v in data.items() if len(v) > 1]

list1 = [[10, '2013-06-18'],[20, '2013-06-19'], [50, '2013-06-23'], [15, '2013-06-30']]
list2 = [[5, '2013-06-18'], [5, '2013-06-23'], [20, '2013-06-25'], [20, '2013-06-30']]

>>> subtract_lists(list1, list2)
[(-5, '2013-06-30'), (45, '2013-06-23'), (5, '2013-06-18')]
>>> # if you want them sorted by date...
>>> sorted(subtract_lists(list1, list2), key=lambda t: t[1])
[(5, '2013-06-18'), (45, '2013-06-23'), (-5, '2013-06-30')]

请注意,2013-06-30日期的差异为-5,而不是+5。

这可以通过使用日期作为字典键来获取给定日期的所有值的列表。然后选择列表中具有多个值的那些列表,并通过减法减少这些列表中的值。如果希望对结果列表进行排序,则可以使用sorted()并将日期项作为键来执行此操作。如果您总是想要这种行为,可以将该操作移动到subtract_lists()函数中。

答案 1 :(得分:0)

我认为这段代码符合您的要求:

list1 = [[10, '2013-06-18'],[20, '2013-06-19'], [50, '2013-06-23'], [15, '2013-06-30']]
list2 = [[5, '2013-06-18'], [5, '2013-06-23'], [20, '2013-06-25'], [20, '2013-06-30']]
list1=dict([[i[1],i[0]] for i in list1])
list2=dict([[i[1],i[0]] for i in list2])
def minus(a,b):
    return { k: a.get(k, 0) - b.get(k, 0) for k in set(a) & set(b) }

minus(list2,list1)

# returns the below, which is now a dictionary
{'2013-06-18': 5, '2013-06-23': 45, '2013-06-30': 5}
# you can convert it back into your format like this
data = [[value,key] for key, value in minus(list1,list2).iteritems()]

但是您的输出数据似乎有误。如果要在列表中包含数据,请改为定义这样的减号:

def minus(a,b):
    return { k: a.get(k, 0) - b.get(k, 0) for k in set(a) | set(b) }

有关详细信息,请参阅Merge and sum of two dictionaries上的此答案。