如何使用defaultdict在python中读取行?

时间:2012-07-23 22:28:10

标签: python dictionary

我有一个字典,用于搜索ID名称并在其后读取令牌。但我想知道是否有办法读取并打印出包含该ID名称的整行。

这是我到目前为止所做的:

lookup = defaultdict(list)
wholelookup =defaultdict(list)
mydata = open('summaryfile.txt')

for line in csv.reader(mydata, delimiter='\t'):
    code = re.match('[a-z](\d+)[a-z]', line[-1], re.I)
    if code: 
        lookup[line[-2]].append(code.group(1))
        wholelookup[line[-2]].append(code.group(0))

2 个答案:

答案 0 :(得分:0)

如果你有足够的内存,最简单的方法就是将行保存在另一个defaultdict中:

wholeline = defaultdict(list)
...
idname = line[-2]
wholeline[idname].append(line)

答案 1 :(得分:0)

您的代码调用csv.reader(),它将返回整行的解析版本。在我的测试中,这将返回一个值列表。如果这个值列表适用于“整行”,那么你可以保存它。

你有一行你附加名为wholelookup的东西。我想您只想保存line而不是code.group(0)code.group(0)返回正则表达式匹配的所有内容,这与line[-1]相同。

所以也许把这一行放在你的代码中:

wholelookup[line[-2]].append(line)

或者您可能需要将line中的值连接在一起以生成单个字符串:

s = ' '.join(line)
wholelookup[line[-2]].append(s)

如果您想要整行,而不是解析版本,那么请执行以下操作:

lookup = defaultdict(list)
wholelookup = defaultdict(list)
pat = re.compile('[a-z](\d+)[a-z]', re.I)

with open('summaryfile.txt') as mydata:
    for s_line in mydata:
        values = s_line.split('\t')
        code = re.match(pat, values[-1])
        if code: 
            lookup[values[-2]].append(code.group(1))
            wholelookup[values[-2]].append(s_line)

此示例预先编译模式以获得轻微的速度优势。