Pythonic循环遍历变量的方式,可以是元素也可以是列表

时间:2016-04-11 13:54:56

标签: python

我正在尝试使用带有变量的for循环,该变量是(列表的)元素或列表。我现在的代码,我发现非常难看。

for x in test if isinstance(test, list) else [test]:
    print(x)

任何改进的pythonic方式?

2 个答案:

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

但这实际上和你已经拥有的一样。根据我的个人经验,从计算步骤中获取所有预处理通常很有用,并确保所有参数都具有有效类型。然后只需执行你需要做的任何操作。