Python 使用for循环理解列表中的if-else
我已经为扁平化列表编写了自己的简单解决方案:Python 使用for循环理解列表中的if-else,python,python-3.x,list,Python,Python 3.x,List,我已经为扁平化列表编写了自己的简单解决方案: lists = [0, 10, [20, 30], 40, 50, [60, 70, 80], [90, 100, 110, 120]] new = [] for item in lists: if str(item).isdigit() != True: for v in item: new.append(v) else: new.append(item) print(new)
lists = [0, 10, [20, 30], 40, 50, [60, 70, 80], [90, 100, 110, 120]]
new = []
for item in lists:
if str(item).isdigit() != True:
for v in item:
new.append(v)
else:
new.append(item)
print(new)
但我想在以下代码中添加一个else
/elif
,以缩短代码:
new = [v for item in lists if str(item).isdigit() != True for v in item]
我不知道如何避免语法错误。试试这个:
>>> [v for item in lists for v in (item if isinstance(item, list) else [item])]
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120]
这有点低效,因为它将一个整数包装到一个列表中,然后对其进行迭代,但对于大多数目的来说,这并不重要。尽量不要使用字符串表示法来检查数据类型,因为可能会导致意外的结果(例如,尝试使用浮点数而不是列表中的整数来运行原始代码)。首先请注意原始代码的一些注意事项:
if str(item).isdigit() != True:
多用蟒蛇
if not str(item).isdigit():
if type(item) is not list:
for
子句之后(在if
过滤表达式中)
因此,您需要将列表理解的第二个中的iterable更改为始终是iterable,例如项
[20,30]
没问题(因为它是一个可编辑的)
10
它不正常(因为它不是一个iterable)-所以让我们用括号括起来-[10]
因此,我们将根据类型(项目)
在项目
和[项目]
之间切换:
(这是一个条件表达式,而不是列表理解,因此这里可以使用else
。)
因此,完整的解决方案可能是
new = [v for item in lists
for v in (item if type(item) is list else [item])]
为了完整起见,我要提到:collections.abc.Iterable
@Aaron老实说,这感觉工作量太大了,因为它也不可靠。调用iter
并捕获异常是一种方法,但这会使本例复杂化,并忽略要点。根据您的解决方案,我找到了我的新解决方案哈哈。。谢谢你,伙计:)new=[v代表列表中的项目,v代表列表中的项目(item if str(item).isdigit()!=True else[item])
。谢谢你的帮助,伙计!
new = [v for item in lists
for v in (item if type(item) is list else [item])]