Python调试-“;不是一份清单”;
我编写了以下代码:Python调试-“;不是一份清单”;,python,debugging,Python,Debugging,我编写了以下代码: def data_preprocessing_tree(data): data = data.split(';') # enumerate data = list(filter(lambda x: not ('..' in x or '//' in x), data)) # clean (noise removal) data = list(map(lambda x: x + 'txt' if x[len(x) - 1] == '.' else x,
def data_preprocessing_tree(data):
data = data.split(';') # enumerate
data = list(filter(lambda x: not ('..' in x or '//' in x), data)) # clean (noise removal)
data = list(map(lambda x: x + 'txt' if x[len(x) - 1] == '.' else x, data)) # complete missing values
data_new = list(map(lambda x: x.rsplit('/', 1) if '.' in x.rsplit('/', 1)[1] else x, data)) # not file?
# data_file = list(map(lambda x: x[len(x) - 1] if '.' in x[len(x) - 1] else '', data_new))
# data_file = list(filter(lambda x: '.' in x, data_file))
data_dir = list(map(lambda x: x[:len(x) - 1] if '.' in x[len(x) - 1] else x, data_new)) # if last is file
# print('{0}\n{1}\n{2}\n\n'.format(data_new, data_file, data_dir))
print('{0}\n{1}\n\n'.format(data_new, data_dir))
# data_dir = list(map(lambda x: x[0] if type(x) == list else x, data_dir))
data_dir = list(map(lambda x: [x] if type(x) != list else x, data_dir))
tmp = data_dir[:]
data_dir = list(filter(lambda x: tmp.remove(x) is None and tmp.count(x) == 0, data_dir))
print(data_dir)
tmp = list(map(lambda x: data_dir[data_new.index(list([x[0]]))].append(x[1]) if type(x) == list else x, data_new))
它在最后一行抛出异常,表示给定的输入不是列表
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "demo.py", line 21, in data_preprocessing_tree
tmp = list(map(lambda x: data_dir[data_new.index(list([x[0]]))].append(x[1]) if type(x) == list else x, data_new))
File "demo.py", line 21, in <lambda>
tmp = list(map(lambda x: data_dir[data_new.index(list([x[0]]))].append(x[1]) if type(x) == list else x, data_new))
ValueError: ['/Users/someuser'] is not in list
为此:
[("/", ()), ("/tmp/download", ("file.zip", "file2.zip", “unknown.txt”)), ("/usr/local/bin", ()), ("/User/someuser/", ("file.py", “uknown.txt”))]
也就是说,一个元组列表,第一个元素包含目录,第二个元素是另一个元组,它包含该位置的所有文件
目前,应该将其放入列表列表中,每个内部列表的第一个元素将是位置,其余元素将是文件。原始数据作为单个文件路径字符串接收,以“;”分隔 构建树的过程如下所示: 1) 将数据转换为字符串形式的文件路径列表[拆分] 2) 如果列表中包含两个点(..)或睫毛(//),则从列表中删除任何路径[filter] 3) 将“txt”附加到任何没有扩展名的文件,即“file”。-->“file.txt”[map] 4) 获取一组不带文件的目录路径,即['/tmp/download/file.zip'、'/tmp/download/file2.zip'、'/usr/local']-->['/tmp/download'、'/usr/local'][map、join、split、rsplit] 5) 将路径列表转换为元组列表,元组分别包含目录路径和文件名,即。['/tmp/download/file.zip'、'/tmp/download/file2.zip'、'/usr/local']-->[('/tmp/download'、'file.zip')、('/tmp/download'、'file2.zip]、('/usr/local',None)][筛选、映射、加入、拆分、rsplit] 6) 对于路径集中的每个路径,创建一个元组,其中第一个元素是路径,第二个元素是包含给定路径中所有文件名的元组,即,['/tmp/download','/usr/local']和[('/tmp/download',file.zip'),('/tmp/download',file2.zip)]->[('/tmp/download',(file.zip,file2.zip)),('/usr/local',())][map,filter] 以上显示的步骤和功能仅为指南,并非获得正确最终答案所必需的 签名,
玛丽娜·利特瓦克(Marina Litvak)这里有没有不使用列表理解的理由?是的,出于对一切神圣事物的热爱,请使用列表理解,而不是使用lambdas映射。它将极大地提高代码的可读性(并略微提高性能)。另外,这是什么:
lambda x:tmp.remove(x)是None,tmp.count(x)==0?无论怎样,它都是超级黑客,并且将突变与功能结构map混合在一起,这是一种糟糕的风格。这会让代码变得混乱,就像这里的情况一样。@删减或保留多行代码……哦,请给出一个包含实际回溯的示例。我想我应该用这个开场。一旦你开始工作了,我强烈建议你去旅游。
[("/", ()), ("/tmp/download", ("file.zip", "file2.zip", “unknown.txt”)), ("/usr/local/bin", ()), ("/User/someuser/", ("file.py", “uknown.txt”))]