我需要计算压力波动p
(这个代码已经很好了);但我还需要在不同的时间位置存储p
的值,以便我有一个函数p(t)
并可以在以后绘制它。
问题是:t
的值是浮点数。带有t
- 值的列表如下所示:
t = [88.386, 88.986, 90.386, ...]
并且其中一些值也会多次出现,这意味着,如果p(t=88.986)
计算多次,则只需要将这两个值相加。
我该如何处理?
我将不胜感激。
答案 0 :(得分:1)
您可以使用装饰器来包装您的函数并以适当的方式缓存值。
In [39]: from functools import wraps
In [40]: from collections import defaultdict
In [41]: cache = defaultdict(float)
In [42]: def cache_value(f):
....: global cache
....: @wraps(f)
....: def wrapped(n):
....: result = f(n)
....: cache[n] += result
....: return result
....: return wrapped
如果defaultdict
已经不存在于字典中,In [43]: @cache_value
....: def p(n):
....: return 2
....:
In [44]:
In [44]: p(6.33)
Out[44]: 2
In [45]: p(6.33)
Out[45]: 2
In [46]: p(4.15)
Out[46]: 2
In [47]: p(5.07)
Out[47]: 2
In [48]: cache
Out[48]: defaultdict(<class 'float'>, {4.15: 2.0, 5.07: 2.0, 6.33: 4.0})
将向缓存添加新项目,否则将新值与前一项相加。
演示:
var self = {
books: ko.observableArray([ {id : 1, title: "A"},{id : 2, title: "B" } ])
};
答案 1 :(得分:1)
从你的答案;你想使用position作为键,并为此有一些价值。这基本上意味着你想使用dict而不是list。您可以通过说dict_time[key] = value
将值分配给字典。一个例子:
dict_time = {}
dict_time[0.1] = 2
print(dict_time[0.1])
//2
总结值,如果值存在,你可以检查它们的键是否已经在dict中,然后如果它存在则求和,否则只需添加它。:
if key in dict_time:
dict_time[key] += value
else:
dict_time[key] = value
或者您可以按照kasramvd的建议使用defaultdict
,在这种情况下,您可以使用+ =而不检查它们是否存在密钥。
稍后您可以通过询问dict_time [key]:
来访问该值>>> dict_time[0.1]
1
答案 2 :(得分:1)
如果您想继续使用列表,您可以使用集合来获取所有唯一的时间值,并总结当时的所有压力元素。压力值将存储在该时间值的第一次重复注册的对应索引中:
p = [3, 5, 6, 5]
t = [88.386, 88.986, 90.386, 88.386]
# the added presures will be stored in this list
new_pressures = []
# get all the different time values
unique_times = set(t)
#Create new null element in list for every unique time
for value in unique_times:
new_pressures.append(0)
for index, item in enumerate(t):
if item == value:
#add to the pressure value every time coincidence index
new_pressures[-1] += p[index]
print new_pressures
该函数的输出结果为:
[8, 5, 6]