在列表推导式中结合len()多条件判断的最Pythonic实现方式
嘿,咱们逐个来解决你的问题:
1. 列表推导式中使用多条件if的最Pythonic方式
在Python里,最符合风格的写法就是直接用逻辑运算符(and/or)把多个条件串联起来,清晰又简洁,完全没必要嵌套if语句。举个例子:
# 筛选出1-20之间的偶数且大于5的数 result = [x for x in range(1, 21) if x % 2 == 0 and x > 5]
这种写法可读性拉满,完全符合Python“优雅、清晰”的设计哲学。如果条件比较复杂,你也可以把条件拆成变量提前定义,不过简单的多条件直接用逻辑组合就足够了。
2. 关于len()拼接字符串的错误观点澄清
曾有错误观点认为调用len()时拼接字符串会报错(示例:
len(str(x)+str(y))不被允许)
这绝对是个错误认知!Python里完全支持直接对拼接后的字符串调用len(),比如:
x = 123 y = 456 print(len(str(x) + str(y))) # 输出6,完全正常
这个错误观点可以直接忽略,放心用就行。
3. 代码场景中lambda配合len()条件判断是否合适?
先看你给出的这段代码:
for j in blah: for i in range(4): inputs = set([ str(j) + "".join(x) for x in itertools.permutations(total, i) if 14 > len(lambda j,x : str(j) + "".join(x)) and len(lambda j, x : str(j) + "".join(x)) > 9])
答案是:完全不合适,而且这里的lambda用法是错误的。
你这里犯了一个关键错误:len(lambda j,x : str(j) + "".join(x))是在尝试求lambda函数对象的长度,但Python里函数本身没有长度属性,运行这段代码会直接抛出TypeError: object of type 'function' has no len()的错误。
你真正想要的是计算str(j) + "".join(x)这个拼接后字符串的长度,根本不需要lambda。正确的写法有几种:
方法1:直接在条件里计算长度(简洁直观)
for j in blah: for i in range(4): inputs = set( str(j) + "".join(x) for x in itertools.permutations(total, i) if 9 < len(str(j) + "".join(x)) < 14 )
方法2:用海象运算符(Python3.8+,避免重复计算)
如果你的Python版本在3.8及以上,用海象运算符可以避免重复拼接字符串,效率更高一点:
for j in blah: for i in range(4): inputs = set( s for x in itertools.permutations(total, i) if 9 < len(s := str(j) + "".join(x)) < 14 )
方法3:先生成候选字符串再过滤(可读性最强)
如果追求极致的可读性,可以把生成和过滤分开:
for j in blah: for i in range(4): # 先生成所有可能的拼接字符串 candidates = [str(j) + "".join(x) for x in itertools.permutations(total, i)] # 再过滤出长度符合要求的 inputs = set(s for s in candidates if 9 < len(s) < 14)
总之,这里用lambda完全是画蛇添足,不仅解决不了问题,还会引发错误,直接计算目标字符串的长度就好。
内容的提问来源于stack exchange,提问作者user9749763
相关产品推荐
相关产品推荐

