在元素或列表变量上循环的Python方式

在元素或列表变量上循环的Python方式,python,Python,我尝试使用for循环和一个变量,该变量是(列表的)元素或列表。我现在的代码很难看 for x in test if isinstance(test, list) else [test]: print(x) 在这方面有什么改进的方法吗 import collections [isinstance(x, collections.Iterable) and x or [x] for x in test] 这将给出一个列表,其中每个元素如果已经是列表,则保持不变,如果还没有列表,则被放入列

我尝试使用for循环和一个变量,该变量是(列表的)元素或列表。我现在的代码很难看

for x in test if isinstance(test, list) else [test]:
    print(x)
在这方面有什么改进的方法吗

import collections

[isinstance(x, collections.Iterable) and x or [x] for x in test]

这将给出一个列表,其中每个元素如果已经是列表,则保持不变,如果还没有列表,则被放入列表中。

首先,您可能希望在检查中包含不同的类型(而不是
列表
),快速方法是:

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)]
我不知道这是否是一种更具python风格的方式,但对我来说,这是最具可读性的方式。如果你真的想减少空间,你的选择可能是最好的方式,因为这是获得一个线性的最佳实践方式。但是,我认为没有任何性能改进(可能恰恰相反)

如果您的
do_stuff
没有定义为函数,因此您不想复制粘贴代码(永远不要这样做),那么最后的另一个选项是只获取分配:

test = test if is_iterable(test) else [test]
for x in test:
    do_stuff
    ...

但这在本质上与你已经拥有的是一样的。根据我个人的经验,从计算步骤中获得所有预处理并确保所有参数都具有有效类型通常是有用的。然后,只需对它们执行您需要执行的任何操作。

我真的不认为这比:
[x in test if istance(test,list)else[test]]
更像是一个python习语,而不是否定您的输入或任何东西。这是一个列表理解,更像是一个python习语。另外一个主要因素是Python的“最好请求原谅,而不是请求许可”原则,这里讨论了这一点,但是如果添加一个try-except,代码显然会更长。我认为你的代码已经是pythonic了,我同意我的建议只是比pythonic多一点。没有其他方法可以让它更具python风格,因为你不能在列表理解中使用else语句——只有在语句不明显的情况下,但我认为这不是一个正确的测试。在本例中,
x
可以是一个
str
,它是可编辑的,但仍应放在列表中。什么是
test
?它是某个自定义类的实例吗?如果它是一个元素,为什么不直接打印变量,并且只在必要时使用for循环呢?创建一个元素列表并使用for循环打印该元素是愚蠢的。你想做什么?例如:test或者是
[{'test':'test'},{'test':'test'},{'test':'test'}]
或者
{'test':'test'}
这都是更大的东西的一部分,但问题是在实际代码中,
test
变量是dict的一部分,其中
test
是键的值。这会产生很长的代码行,这很难看/不可读。例如:
rep_list=adaption['Representation'],如果是instance(adaption['Representation'],list),则为[adaption['Representation']]
我认为您得到的是可以的。我注意到您确实需要测试
test
是否是
列表
,因为您的单例元素可能是
str
(例如),因此是可编辑的。我接受您的答案是因为它的完整性,并且已经使用了类似于上一个示例的解决方案。@Snuggger是的,上一个示例与您提出的方法完全相同(通过检查foor循环)。在这种情况下,您只希望迭代一个列表。但是,在实践中,如果您有一个接受不同类型的多个参数的函数,那么更清楚的方法是先解析它们,然后将它们转换为有效格式,然后执行所有计算。