首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正确使用split()

问正确使用split()
EN

Stack Overflow用户
提问于 2014-05-12 16:27:04
回答 1查看 311关注 0票数 0

我试图拆分文本行,并将关键信息存储在字典中。

例如,我的行看起来如下:

代码语言:javascript
复制
Lasal_00010 H293|H293_08936 42.37   321 164 8   27  344 37  339 7e-74    236
Lasal_00010 SSEG|SSEG_00350 43.53   317 156 9   30  342 42  339 7e-74    240

对于第一行,我的键是"Lasal_00010",我要存储的值是"H293“。

在这种情况下,我当前的代码工作正常,但是当我遇到这样的一行时:

代码语言:javascript
复制
Lasal_00030 SSCG|pSCL4|SSCG_06461   27.06   218 83  6   37  230 35  200 5e-11   64.3

我的代码不会存储字符串"SSCG“。

以下是我的当前代码:

代码语言:javascript
复制
dataHash = {}
with open(fasta,'r') as f:
    for ln in f:
        query = ln.split('\t')[0]   
        query.strip()   
        tempValue = ln.split('\t')[1]
        value = tempValue.split('|')[0]
        value.strip()
        if not dataHash.has_key(query):
            dataHash[query] = ''
        else:
            dataHash[query] = value
for x in dataHash:
    print x + " " + str(dataHash[x])

我相信在这种情况下,我用两根竖线来划分直线是不正确的。但我不知道我的问题在哪里。难道"SSCG“不是我写value = tempValue.split('|')[0]时得到的值吗?有人能向我解释一下斯普利特是怎么工作的还是我错过了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-12 16:28:21

在第一根管子上分开,然后在空间上:

代码语言:javascript
复制
with open(fasta,'r') as f:
    for ln in f:
        query, value = ln.partition('|')[0].split()

我在这里使用str.partition(),因为您只需要拆分一次。

您的代码对使用选项卡的位置进行了假设;首先在第一个管道上拆分,我们就可以完全忽略行的其余部分,从而使从第二列拆分第一列变得更加简单。

演示:

代码语言:javascript
复制
>>> lines = '''\
... Lasal_00010 H293|H293_08936 42.37   321 164 8   27  344 37  339 7e-74    236
... Lasal_00010 SSEG|SSEG_00350 43.53   317 156 9   30  342 42  339 7e-74    240
... Lasal_00030 SSCG|pSCL4|SSCG_06461   27.06   218 83  6   37  230 35  200 5e-11   64.3
... '''
>>> for ln in lines.splitlines(True):
...     query, value = ln.partition('|')[0].split()
...     print query, value
... 
Lasal_00010 H293
Lasal_00010 SSEG
Lasal_00030 SSCG

但是,您的代码在某种程度上也能工作,尽管效率较低。你真正的问题是:

代码语言:javascript
复制
if not dataHash.has_key(query):
    dataHash[query] = ''
else:
    dataHash[query] = value

这实际上意味着:当我第一次看到query时,存储一个空字符串,否则存储value。我不知道为什么要这样做;如果没有以Lasal_00030开头的其他行,那么字典中只有一个空值。如果这不是目的所在,那就把价值存储起来:

代码语言:javascript
复制
dataHash[query] = value

没有if语句。

请注意,dict.has_key()已被废弃;最好使用in来测试密钥:

代码语言:javascript
复制
if query not in dataHash:
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23614205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档