【问题标题】:For loop using enumerate through a list with an if statement to search lines for a particular stringFor 循环使用枚举列表和 if 语句来搜索特定字符串的行
【发布时间】:2013-10-19 02:02:52
【问题描述】:

我将编译一个循环字符串列表(事务 ID)。 我很困惑。我研究了正确的方法,觉得这段代码应该可以工作。 但是,我在第二个街区做错了什么。 第一个块正确编译了我想要的字符串列表。

我无法让第二个块工作。如果我简化,我可以打印列表中的每个值 通过使用

for idx, val in enumerate(tidarray): print val

似乎我现在应该能够使用该值在每一行中搜索该字符串, 然后打印该行(实际上我将它与另一个搜索词结合使用 减少行读取的数量,但这是我进一步磨练之前的基本测试。

def main():
    pass

samlfile= "2013-08-18 06:24:27,410 tid:5af193fdc DEBUG org.sourceid.saml20.domain.AttributeMapping] Source attributes:{SAML_AUTHN_CTX=urn:oasis:names:tc:SAML:2.0:ac:classes"
tidarray = []

for line in samlfile:  

    if "tid:" in line:
        str=line
        tid = re.search(r'(tid:.*?)(?= )', str)
        if tid.group() not in tidarray:
            tidarray.append(tid.group())

for line in samlfile:
    for idx, val in enumerate(tidarray):
        if val in line:
            print line

有人可以建议对第二个代码块进行更正吗?我认识到两次读取文件并不是最优雅的解决方案......我在这里的主要目标是学习如何枚举列表并在后续代码中使用每个值。

【问题讨论】:

  • 请注意,我已经编辑了您的帖子,使其看起来更漂亮(现在是第三次)。您可以编辑您的帖子以查看格式如何正确完成。如果您提供一些输入样本而不是 open() 行,这样其他人就知道您的数据是什么样子了,那就太好了。
  • 感谢 nemo 的帮助...我似乎无法更早地将其格式化。

标签: python-2.7 if-statement for-loop enumerate


【解决方案1】:

两次迭代一个文件

基本上你要做的是:

for line in somefile: pass # first run
for line in somefile: pass # second run

第一次运行会很好地完成,第二次运行根本不会运行。 这是因为文件被读取到最后并且没有更多的数据可以从中读取行。 调用somefile.seek(0) 跳转到文件开头:

for line in somefile: pass # first run
somefile.seek(0)
for line in somefile: pass # second run

以独特的方式存储事物

基本上,您似乎想要一种将文件中的 ID 存储在 a 数据结构和每个 id 只能在所述结构中出现一次。

如果您想存储您使用的唯一元素,例如字典 (help(dict)) 或设置 (help(set))。集合示例:

myset = set()
myset.add(2)  # set([2])
myset.add(3)  # set([2,3])
myset.add(2)  # set([2,3])

【讨论】:

  • 感谢关于使用集合而不是附加到列表的提示。通过构建集合而不是日志文件中的 ID 列表,我节省了 11 多秒。此外,它为我的下一个 for 循环的每次迭代节省了大约 1 秒的时间,该循环使用该集合....有 10,000 多个唯一 ID,因此加起来很快。
  • 太棒了!对于您提出的其他问题:请注意,您可以接受最能帮助您回答问题的答案。这会将答案标记为已接受,并以声誉奖励回答者。
猜你喜欢
  • 2013-04-22
  • 2012-11-09
  • 1970-01-01
  • 2015-01-15
  • 1970-01-01
  • 2011-12-05
  • 2012-04-18
  • 2021-06-13
  • 1970-01-01
相关资源
最近更新 更多