我正在尝试编写一个具有数据LP的函数,并根据LP的值,会有一些输出。
using (var writer = new System.IO.StreamWriter(journalsCsvSFD.OpenFile()))
using (var csv = new CsvHelper.CsvWriter(writer))
{
csv.Configuration.TypeConverterOptionsCache.GetOptions<DateTime>().Formats = new[] { "dd/MM/yyyy" };
csv.WriteRecords(records);
}
答案 0 :(得分:2)
如果您真的想要它的循环版本,由于索引不一致,需要一些技巧:
def data(lp,matrix):
splits = [20, 30, 40, 65, 80]
indices = [(0,0), (1,2), (3,3), (4,4), (5,5), (6,6)]
for split, (id1, id2) in zip(splits, indices):
if lp < split:
return lp*matrix.t1[id1] + matrix.t2[id2]
return lp*matrix.t1[indices[-1][0]] + matrix.t2[indices[-1][1]]
但是,老实说,我只是将其展开,我认为它更易于阅读。
def data(lp,matrix):
if lp<20:
return lp*matrix.t1[0] + matrix.t2[0]
elif lp<30:
return lp*matrix.t1[1] + matrix.t2[2]
elif lp<50:
return lp*matrix.t1[3] + matrix.t2[3]
elif lp<65:
return lp*matrix.t1[4] + matrix.t2[4]
elif lp<80:
return lp*matrix.t1[5] + matrix.t2[5]
else:
return lp*matrix.t1[6] + matrix.t2[6]
答案 1 :(得分:1)
您为什么不将所有内容循环?对我来说似乎更干净。
bounds = [20,30,50,65,80]
n = len(bounds)
for i, bound in enumerate(bounds):
if lp < bound:
return lp*matrix.t1[i] + matrix.t2[i]
return lp * matrix.t1[n] + matrix.t2[n]
编辑: 所以我有点盲目,没有看到索引没有循环。您仍然可以选择这样的解决方案,只需保留索引列表
bounds = [20,30,50,65,80]
idxs = [(0,0), (1,2), (3,3), (4,4), (5,5), (6,6)]
for i,bound in enumerate(bounds):
if lp<bound:
return lp*matrix.t1[idxs[i][0]] + matrix.t2[idxs[i][1]]
return lp*matrix.t1[idxs[-1][0]] + matrix.t2[idxs[-1][1]]
如果您有更多的案例,这可能会很有用。否则,出于简单性原因,我可能只会选择其他答案。
答案 2 :(得分:0)
您可以使用bisect,并具有更高效的比较逻辑的优点:
from bisect import bisect_left
def data(lp,matrix):
control = [ 20, 30, 50, 65, 80 ]
indexes = [(0,0), (1,2), (3,3), (4,4), (5,5), (6,6)]
c = bisect_left(lp,control)
i,j = indexes[c]
return lp*matrix.t1[i] + matrix.t2[j]