Python,检查一个列表是否包含来自另一个列表的元素,并有效地比较它们

Python,检查一个列表是否包含来自另一个列表的元素,并有效地比较它们,python,Python,我创建了两个列表,其中包含来自不同机器的日志文件 因此,我有machine1文件夹,其中包含perf_log.txt,stress_log.txt等等。 然后我有machine2文件夹,其中包含与上面相同的文件名。在某些情况下,我可能有来自一台机器的日志,但没有来自另一台机器的日志 items_in_both = list1[pd.Series(list1).isin(list2)] 到目前为止,为了比较它们的内容,我所做的是解析一个文件夹中的所有文件,并将完整路径添加到列表中,然后对第二个文

我创建了两个列表,其中包含来自不同机器的日志文件

因此,我有
machine1
文件夹,其中包含
perf_log.txt
stress_log.txt
等等。 然后我有
machine2
文件夹,其中包含与上面相同的文件名。在某些情况下,我可能有来自一台机器的日志,但没有来自另一台机器的日志

items_in_both = list1[pd.Series(list1).isin(list2)]
到目前为止,为了比较它们的内容,我所做的是解析一个文件夹中的所有文件,并将完整路径添加到列表中,然后对第二个文件夹执行相同的操作。然后我想比较两台机器之间的对应日志(比如perf_log.txt)

但我最终只解析了第一个列表一次,但每次我都必须检查第二个列表是否包含条目,如果包含条目,我必须在比较文件之前检索索引。对于文件夹中的许多文件来说,这似乎相当昂贵

list1 = []
list2 = []

path1 = "~/Desktop/machine1/"
path2 = "~/Desktop/machine2/"

os.chdir(path1)
for entry in glob.glob("*.txt"):
    list1.append(entry)

os.chdir(path2)
for entry in glob.glob("*.txt"):
    list2.append(entry)

for logfile in list1:
    if logfile in list2:
        # Retrieve the index of the common file
        item_index = list2.index(logfile)
        # parse files and compare them
        comparefiles(path1 + logfile, path2 + list2[index])

我怎样才能简化这一点,并尝试达到O(n)的复杂性?

因为顺序并不重要

list(set(list1) & set(list2))
您正在两个列表之间执行交集操作,这两个列表首先被设置为集合。现在您有了
list1
list2
中的条目列表。在您有了一个通用的条目列表之后,您可以在这两个文件之间执行比较


这不是O(n)解决方案,可能是O(nlogn)解决方案。仍然比问题中给出的代码性能更好

我不确定
集合
是否提供了O(n)复杂度,但它们肯定会使查找两个列表之间的差异变得更容易,因为您可以执行减法:


我假设文件名/路径是唯一的。

使用字典而不是列表。 因此,您可以执行
dict[entry]=entry,而不是
list1.append(entry)
这将有助于在代码的后面部分,您将在列表2中执行
if日志文件:
,它将遍历整个列表以找到它。相反,如果dict.get(logfile,-1)!=-1
检查文件是否存在于O(1)中的第二个路径中。然后,只需将路径传递给
comparefiles()
方法即可

我希望这是有道理的

下面是应该可以工作的代码。(不过我还没有测试过)


如果使用numpy和pandas系列,您可能会得到一些很好的改进

在开始之前,请输入numpy和熊猫

import numpy as np
import pandas as pd
现在将列表转换为numpy数组

list1 = np.array(list1)
list2 = np.array(list2)
现在,您可以利用索引找出一个组中的哪些文件也在另一个组中

items_in_both = list1[pd.Series(list1).isin(list2)]
现在,两个列表中的
items\u都包含两个列表中出现的所有项目。这样,您就可以为
items\u中的每个元素调用
comparefiles
函数一次

items_in_both = list1[pd.Series(list1).isin(list2)]