2

我需要遍历 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/用户/桌面/文件夹/3.txt','4534v4535v353']]

big_list1 = [['/home/user/Desktop/folder/1.txt','93n8nv35732vb9528'],['/home/user/Desktop/folder/2.txt','43284fh234h'],['/home/用户/桌面/文件夹/3.txt','4534v4535v353']]

输出应该是:'/home/user/Desktop/folder/1.txt','93n8nv35732vb9527' 因为它的路径相同但 md5 不同

4

2 回答 2

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

无论如何,您的代码/想法似乎是正确的,但没有样本输入就无法真正验证。

于 2013-09-01T10:28:03.857 回答
1

假设既不small_list1也不small_list2包含重复的路径(出现在两个列表中的路径都很好),听起来你应该使用 dicts。代替列表[path, md5]列表,使字典映射路径到校验和。然后,您可以有效地查找每个路径的校验和:

path_dict1 = something()
path_dict2 = something_else()
save_list = [(path, md5) for path, md5 in path_dict2.viewitems()
             if md5 != path_dict1.get(path)]

这将比基于列表的解决方案运行得快得多,后者所花费的时间与输入列表长度的乘积成正比。该解决方案所花费的时间与路径的数量成正比。

于 2013-09-01T10:33:33.977 回答