我正在尝试创建一个有序列表,如下所示>
['term1_t1', 'term2_t1', 'term3_t1', 'term4_t1', 'term5_t1', 'term1_t2', 'term2_t2', 'term3_t2', 'term4_t2', 'term5_t2', 'term1_t3', 'term2_t3', 'term3_t3', 'term4_t3', 'term5_t3']
我希望列表根据术语数量和时间段数量的输入而变化" t"。简单的列表推导提供了如下所需的输出:
terms = 5
periods = 360
lst = ["term{}_t{}".format(j,i) for i in range(1, periods + 1) for j in range(1, terms + 1)]
但是我看到SO上有关使用lambda和chain的建议,如下所示:
f1 = lambda x: "term1_t" + str(x)
f2 = lambda x: "term2_t" + str(x)
f3 = lambda x: "term3_t" + str(x)
f4 = lambda x: "term4_t" + str(x)
f5 = lambda x: "term5_t" + str(x)
investments = list(chain.from_iterable((f1(x), f2(x), f3(x), f4(x), f5(x)) for x in range(1, 361)))
上述问题是我无法改变术语数量。
所以我在字典键中玩弄lambdas,我不明白它们是如何工作的。例如,以下代码:
d= {}
for i in range(1, 6):
d["f{}".format(i)] = "term" + str(i) + "_t"
print (d['f1'])
返回:
term1_t
但是当我尝试合并lambda时,代码如下:
d= {}
for i in range(1, 6):
d["f{}".format(i)] = lambda x: "term" + str(i) + "_t" + str(x)
print (d['f1'](1))
返回:
term5_t1
我的问题是双重的:
(1)为什么要合并lambda函数改变它不引用的字符串部分的值(至少在我看来)?
(2)有没有办法使用比理解更快的lambda和chain,还允许更改lambda函数的数量?
答案 0 :(得分:-1)
问题不在于lambda本身,而在于i。
str()
- 函数没有得到评估,因为在你调用它之前,整个lambda都没有得到评估。
循环后,i
等于5!
要评估str()
,请尝试分配变量:
d= {}
for i in range(1, 6):
number = str(i)
d["f{}".format(i)] = lambda x: "term" + number + "_t" + str(x)
print (d['f1'](1))