我需要运行2个列表(这些列表是'列表列表')这些列表中的每个项目都包含[path,md5]并创建一个if语句,其工作方式如下: (逻辑上)
save_list = []
for small_list2 in big_list2:
for small_list1 in big_list1:
if small_list2[0] == small_list1[0] and small_list2[1] != small_list2[1]:
save_list.append(small_list2)
这是这样的吗?并且,有更好的(可能是递归的方式)来做到这一点??
谢谢!
编辑: 样本输入:( md5不真实也不合理) [PATH,MD5]
big_list2 = [['/home/user/Desktop/folder/1.txt','93n8nv35732vb9527'],['/ home / user / Desktop / folder / 2.txt','43284fh234h'],[' /home/user/Desktop/folder/3.txt”, '4534v4535v353']]
big_list1 = [['/home/user/Desktop/folder/1.txt','93n8nv35732vb9528'],['/ home / user / Desktop / folder / 2.txt','43284fh234h'],[' /home/user/Desktop/folder/3.txt”, '4534v4535v353']]
输出应该是: '/home/user/Desktop/folder/1.txt','93n8nv35732vb9527' 因为它的路径相同但md5不同
答案 0 :(得分:1)
嗯,你可以在一行中做一些疯狂的列表理解。但我不认为它会非常易读。
save_list = [small_list2 for small_list2 in big_list2 for small_list1 in big_list1 if small_list2[0] == small_list1[0] and small_list2[1] != small_list2[1]]
是的......请不要那样写。 :P
无论如何,你的代码/想法似乎是正确的,但没有样本输入就无法真正验证。
答案 1 :(得分:1)
假设small_list1
和small_list2
都不包含重复路径(两个列表中出现的路径都很好),听起来你应该使用dicts。而不是[path, md5]
列表的列表,使dicts映射到校验和的路径。然后,您可以有效地查找每个路径的校验和:
path_dict1 = something()
path_dict2 = something_else()
save_list = [(path, md5) for path, md5 in path_dict2.viewitems()
if md5 != path_dict1.get(path)]
这比基于列表的解决方案运行得快得多,后者需要的时间与输入列表长度的乘积成正比。此解决方案需要的时间与路径数成比例。