1

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

2 に答える 2

0

十分なメモリがある場合、最も簡単な方法は、行を別のdefaultdictに保存することです。

wholeline = defaultdict(list)
...
idname = line[-2]
wholeline[idname].append(line)
于 2012-07-23T22:38:40.930 に答える
0

csv.reader()行全体の解析済みバージョンを返すコード呼び出し。私のテストでは、これは値のリストを返します。この値のリストが「行全体」に適している場合は、それを保存できます。

と呼ばれるものを追加する行がありますwholelookuplineの代わりにそこに保存したいだけだと思いますcode.group(0)code.group(0)は、正規表現に一致するすべてのものを返します。これは と同じですline[-1]

だから多分あなたのコードにこの行を入れてください:

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

または、値を結合してline1 つの文字列にする必要があるかもしれません。

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)

この例では、速度をわずかに向上させるためにパターンをプリコンパイルしています。

于 2012-07-23T22:49:58.453 に答える