我有一个类似下面的结构,如何使用1(或更多)列表推导来获得相同的输出?
f2remove = []
for path in (a,b):
for item in os.listdir(path):
if os.path.isdir(os.path.join(path,item)):
x = parse_name(item)
if x and (ref - x).days >= 0:
f2remove.append(os.path.join(path,item))
我尝试了多项内容,例如
files = [parse_name(item)\
for item in os.listdir(path) \
for path in (a,b)\
if os.path.isdir(os.path.join(path,item))] # get name error
f2remove = [] # problem, don't have path...
错误:
Traceback (most recent call last):
File "C:\Users\karuna\Desktop\test.py", line 33, in <module>
for item in os.listdir(path) \
NameError: name 'path' is not defined
答案 0 :(得分:4)
for
的顺序不会改变。您案件中的情况变得尴尬:
f2remove = [
os.path.join(path, item)
for path in (a,b)
for item in os.listdir(path)
if os.path.isdir(os.path.join(path, item))
for x in (parse_name(item),)
if x and (ref - x).days >= 0
]
基本上,要将嵌套的for
转换为列表理解,您只需移动append
前面的任何内容:
result = []
for a in A:
for b in B:
if test(a, b):
result.append((a, b))
变为
result = [
(a, b)
for a in A
for b in B
if test(a, b)
]
答案 1 :(得分:2)
这应该可以胜任,
f2remove = [
os.path.join(path,item)
for item in [os.listdir(path)
for path in (a,b)]
if os.path.isdir(os.path.join(path,item))
and parse_name(item) and
(ref - parse_name(item)).days >= 0]
但您的初始版本更具可读性。