通过属性比较两个无序列表的Pythonic方法

通过属性比较两个无序列表的Pythonic方法,python,list,Python,List,用一个或多个属性来比较两个无序列表的最有技巧的方法是什么? 我想知道是否有一种pythonic方法来确定列表a中的每个项目是否在列表B中存在一个项目,其中列表a中的项目与列表B中的项目在指定属性中匹配 在我的示例中,我在一个单元测试中有两个.zip文件,如果文件匹配,我想进行测试,但我确实在为我的个人工具集寻找一个好的通用解决方案。 这是我第一次尝试: with ZipFile('A.zip') as old: with ZipFile('B.zip') as new: oldFileInfo

用一个或多个属性来比较两个无序列表的最有技巧的方法是什么? 我想知道是否有一种pythonic方法来确定列表a中的每个项目是否在列表B中存在一个项目,其中列表a中的项目与列表B中的项目在指定属性中匹配

在我的示例中,我在一个单元测试中有两个.zip文件,如果文件匹配,我想进行测试,但我确实在为我的个人工具集寻找一个好的通用解决方案。 这是我第一次尝试:

with ZipFile('A.zip') as old:
with ZipFile('B.zip') as new:
oldFileInfo = old.infolist()

allFound = True
for info in new.infolist():
   matches = [item for item in oldFileInfo if item.CRC == info.CRC and \   
              basename(item.filename) == basename(info.filename) ]
   if len(matches) == 0:
       allFound = False
       break
也许这是微不足道的,但我还没有找到一个好的方法来做它


问候Michael

一种可能的方法是:

def areEqual(old, new):
    set1 = set((x.attribute1, x.attribute2) for x in old)
    set2 = set((x.attribute1, x.attribute2) for x in new)

    return set1 == set2

您可以创建新旧列表的集合,然后比较它们:

old_set = set((item.CRC, item.filename) for item in old_info)
new_set = set((item.CRC, item.filename) for item in new_info)

all_match = new_set.issubset(old_set)  # or old_set.issuperset(new_set)

您可以从对列表进行排序开始。它只有一个bigO of n log n,然后您可以逐个比较元素,如果发现一对不匹配,则停止。这很简单,您应该使用集合:

if set(list1).difference(set(list2)):
    # lists are different
    # different_items = set(list1).difference(set(list2))
    pass
else:
    # lists are the same
    pass
您可以将结构转换为ITerable或List:

list1 = [(i.CRC, basename(i.filename)) for i in old.infolist()]
list2 = [(i.CRC, basename(i.filename)) for i in new.infolist()]

缩进有点问题。我同意费多斯米尔诺夫和贝雷尔的回答。一个是考虑性能,另一个是考虑可读性。什么对你更重要?如果这部分代码使用太多,我会选择第一个选项。@ArthurJulião我不认为排序和列表比较会更快。这两种解决方案都是O(n*logn),但是
issubset
是用C内部实现的,而定制迭代将用Python实现。也许值得一查。是的,我没有看到那个@berealthank。这是非常清楚和简单的但是其他的也不坏。这有点错误,因为[1,2,3,3,3,3]不应该等于[2,3,1]@polvoazul我不这么认为-请阅读问题。列表A[1,2,3,3,3,3]中的所有项目均显示在列表B[2,3,1]中。是的,列表B中的所有项目也显示在列表A中。所以在这种情况下,这些列表是相等的。如果要逐个比较列表,只需使用len(A)==len(B)作为附加的最顶层条件。