【问题标题】:Alternative to using flags when iterating through objects in python在 python 中迭代对象时使用标志的替代方法
【发布时间】:2012-10-24 19:01:36
【问题描述】:

我有一个脚本,它使用 xlrd 比较两个 .xls 工作表之间的值。默认情况下,它可以让我查找相似之处,并将它们写入 txt 文件。如果我传入一个参数,我可以查找每个 .xls 独有的设备,并将其写入 txt 文件。现在,我遍历每个 .xls 中的行,并在发现两个文件之间存在相似性时将标志标记为 True。当标志标记为 False 时,它​​只会从第一张表写入主机。这是带有标志的代码:

else:
    for row1 in range(sheet1.nrows):
        inboth = False
        for row2 in range(sheet2.nrows):
            if sheet2.row_values(row2)[0].split(".")[0] == sheet1.row_values(row1)[0].split(".")[0]:
                inboth = True
        if not inboth:
            outfile.write(sheet1.row_values(row1)[0].split(".")[0] + ",File1\n")
    for row2 in range(sheet2.nrows):
        inboth = False
        for row1 in range(sheet1.nrows):
            if sheet1.row_values(row1)[0].split(".")[0] == sheet2.row_values(row2)[0].split(".")[0]:
                inboth = True
        if not inboth:
            outfile.write(sheet2.row_values(row2)[0].split(".")[0] + ",File2\n")

有没有更有效的方法可以在不使用“inboth”标志的情况下做到这一点?有没有一种解决方案,我不需要对两张表进行两次迭代?

【问题讨论】:

  • 测试总数为 2xNxM,其中 N 和 M 分别是 scheet1 和 scheet2 中的行数。这是计算机科学语言中的 O(N^2),并且会让您在处理大型数据集时编码极其缓慢。

标签: python excel loops flags xlrd


【解决方案1】:

您想要的是 Python set 数据类型。 http://docs.python.org/library/sets.html 遍历第一个文件并将找到的所有设备放入集合s,然后将第二个文件中的所有设备放入集合t。然后做:

r = s.symmetric_difference(t)

r 将设备列表放在一个文件中,而不是两个文件中。

【讨论】:

  • 哇,它也快多了。非常感谢!
  • 是的,它的速度非常快,因为它现在只有 O(N)。
  • 速度更快的原因是在您的原始文件中,如果文件 1 有 m 行,而文件 2 有 n 行,则您扫描了 2*m*n 行。使用集合仅扫描 2*(m+n) 行。 `symetric_difference() 也是 O(m+n)。
猜你喜欢
  • 2015-12-29
  • 2021-06-08
  • 2020-02-12
  • 2021-10-13
  • 2014-01-01
  • 2019-05-12
  • 2020-01-03
  • 2021-07-05
  • 2013-09-19
相关资源
最近更新 更多