另一个列表中的Python检查列表

时间:2013-09-01 10:13:11

标签: python list recursion performance

我需要运行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不同

2 个答案:

答案 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_list1small_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)]

这比基于列表的解决方案运行得快得多,后者需要的时间与输入列表长度的乘积成正比。此解决方案需要的时间与路径数成比例。