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

问题描述:

我有一个字典,它搜索一个ID名称并在它后面读取令牌。但是我想知道是否有办法读取并打印出包含该ID名称的整行。如何在Python中使用defaultdict读取行?

这是我到目前为止有:

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)) 

代码调用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) 

此为例e预先编制了轻微速度优势的模式。

+0

有没有一种方法可以将解析的版本和整行版本作为两个变量来获取? – 2012-07-23 22:55:39

+0

我也尝试你的代码第三块它说行没有定义 – 2012-07-23 23:00:55

+0

我的代码中有一个错字。这应该是's_line.split()'...我修复了它。 – steveha 2012-07-24 00:11:50

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

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

不起作用..它给我奇怪的结果: ....你能告诉我你将如何把它放在我的代码中吗? – 2012-07-23 22:52:27