我正在尝试使用带有变量的for循环,该变量是(列表的)元素或列表。我现在的代码,我发现非常难看。
for x in test if isinstance(test, list) else [test]:
print(x)
任何改进的pythonic方式?
答案 0 :(得分:0)
import collections
[isinstance(x, collections.Iterable) and x or [x] for x in test]
这给出了一个列表,其中每个元素如果已经是一个列表就会保持不变,如果还没有,则列入列表。
答案 1 :(得分:0)
首先,您可能希望在支票中包含不同类型(而不是list
),并且可以快速执行此操作:
def is_iterable(x):
return type(x) in [list, tuple] # or just isinstance(x, list)
有了这个,我可能最终会做类似的事情:
if is_iterable(test):
for x in test:
do_stuff(x)
else:
do_stuff(test)
或者如果您期望任何回报:
if is_iterable(test):
return [do_stuff(x) for x in test]
else:
return [do_stuff(test)]
我不知道是否有更多的pythonic方式(或不是)这样做,但对我来说,是最可读的方式。如果你真的想减少空间,可能你的选择是要走的路,这是获得单线的最佳实用方法。但是,我认为没有任何性能提升(可能恰恰相反)。
另一个最后一个选项,如果你的do_stuff
没有被定义为一个函数,因此你不想复制粘贴代码(从不这样做),那就是获取分配:
test = test if is_iterable(test) else [test]
for x in test:
do_stuff
...
但这实际上和你已经拥有的一样。根据我的个人经验,从计算步骤中获取所有预处理通常很有用,并确保所有参数都具有有效类型。然后只需执行你需要做的任何操作。