python:如何使用带有列表值的字典来搜索文件

时间:2013-01-15 04:48:18

标签: python dictionary

希望这是一个简单的问题:

这是我的字典temp = {'0.1995': ['in1', 'in2'], '0.399': ['in0', 'y']})

搜索文件的代码:

for line in SPFFile:
    temp_dict = temp            
    for val in temp_dict.itervalues():      
    if re.search(val.upper(),line) and ((re.search("^R",line) or re.search("^C",line))):
         print "value found!"

我的问题是val是一个列表,如['in1','in2'],而我需要val为'in1'然后'in2'等等。

如果我不应该使用字典来执行此操作,请告诉我。该词典由两个列表组成。

2 个答案:

答案 0 :(得分:2)

将内部for循环更改为:

for key, vals in temp_dict.items():
    if re.search('|'.join(vals)):
        #do stuff here

至于首先使用字典,这完全取决于您是否需要通过键组织的值,如上所述。如果您只是想检查给定行中是否存在任何值,那么将'|'.join()所有值放在一起可能会更好,并将结果字符串用作搜索表达式。

答案 1 :(得分:2)

  • 虽然您可以牺牲性能的可读性, 尝试使用一个正则表达而不是三个。所以,例如:

    if re.match('[RC].*(?:%s)' % '|'.join(map(re.escape, val), line):
        print "value found!"
    
    如果'R'或'C'不是您要匹配的val项目的一部分,那么

    会在一步中执行您所描述的操作。如果是,您可以使用lookahead:

    if re.match('(?=.*%s)[RC]' % '|'.join(map(re.escape, val), line):
        print "value found!"
    
  • 除非您计划重新分配,否则
  • temp_dict = temp不会执行任何操作 某地后到temp;它只是给temp一个新的内容 名称。您也可以考虑为变量提供比tempval更有意义的名称。

  • 虽然re模块中内置了正则表达式缓存, 你应养成编译正则表达式的习惯 将反复使用,因为它会给你实质性的表现 好处。 这是我的风格,对你来说可能过于冗长:

    RE_BEGINS_WITH_R_OR_C = re.compile('^[RC]')
    

    当然,如果你每次循环都使用一个新的正则表达式,那么这样做是没有意义的......但如果你在上面的代码中,如果你只关心那个 项匹配,而不是哪个项匹配,那么您可以使用this answer展平列表列表(嵌套列表理解语法令人困惑,我不会争论:-),编译一个单个正则表达式,只需对文件的每一行使用

  • 请注意the difference between re.match and re.search。当您可以使用re.search时,无需锚定re.match

一般情况下,请阅读文档!不算太差!你可以先看一下你正在使用的Python(字符串,列表,字典和正则表达式)。