使用lambda创建一个包含多个字符串输入python的有序列表

时间:2017-04-08 11:27:26

标签: python list dictionary lambda chain

我正在尝试创建一个有序列表,如下所示>

['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函数的数量?

1 个答案:

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