如何在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预先编制了轻微速度优势的模式。
答
如果你有足够的内存,最简单的方法是简单地保存在另一个defaultdict行:
wholeline = defaultdict(list)
...
idname = line[-2]
wholeline[idname].append(line)
+0
不起作用..它给我奇怪的结果:
有没有一种方法可以将解析的版本和整行版本作为两个变量来获取? – 2012-07-23 22:55:39
我也尝试你的代码第三块它说行没有定义 – 2012-07-23 23:00:55
我的代码中有一个错字。这应该是's_line.split()'...我修复了它。 – steveha 2012-07-24 00:11:50