删除依赖于一列的行

2024-06-16 13:57:29 发布

您现在位置:Python中文网/ 问答频道 /正文

为了更好地理解1.)python的工作原理&;2.)此特定脚本的作用;如果我能把它做得更好的话(也就是说,通过稍微多样化的输入来使用)

好吧,我的代码中有一行是这样的:

thisChrominfo = chrominfo[thisChrom]

其中chrominfo调用如下所示的字典集:

{'chrY': ['chrY', '59373566', '3036303846'], 'chrX': ['chrX', '155270560', '2881033286'], 'chr13': ['chr13', '115169878', '2084766301'], 'chr12': ['chr12', '133851895', '1950914406'], 'chr11': ['chr11', '135006516', '1815907890'], 'chr10': ['chr10', '135534747', '1680373143'], 'chr17': ['chr17', '81195210', '2500171864'], 'chr16': ['chr16', '90354753', '2409817111'], 'chr15': ['chr15', '102531392', '2307285719'], 'chr14': ['chr14', '107349540', '2199936179'], 'chr19': ['chr19', '59128983', '2659444322'], 'chr18': ['chr18', '78077248', '2581367074'], 'chrM': ['chrM', '16571', '3095677412'], 'chr22': ['chr22', '51304566', '2829728720'], 'chr20': ['chr20', '63025520', '2718573305'], 'chr21': ['chr21', '48129895', '2781598825'], 'chr7': ['chr7', '159138663', '1233657027'], 'chr6': ['chr6', '171115067', '1062541960'], 'chr5': ['chr5', '180915260', '881626700'], 'chr4': ['chr4', '191154276', '690472424'], 'chr3': ['chr3', '198022430', '492449994'], 'chr2': ['chr2', '243199373', '249250621'], 'chr1': ['chr1', '249250621', '0'], 'chr9': ['chr9', '141213431', '1539159712'], 'chr8': ['chr8', '146364022', '1392795690']}

thisChrom调用单个列(非整数),其中包含以下内容:

'*' to `chr4`to `chrY` etc. 

thisChrom一次只返回一个值,因为它依赖于文件中仅指定一行的较高位置:

for x in INFILE:
    arow = x.rstrip().split("\t")
    thisChrom = arow[2]
    thisChrompos = arow[3]

所以它从一行中抽出一列

当像'*'这样的值出现在arow中时,整个过程就会崩溃,因为这不在chrominfo字典中。一开始我认为我应该直接把它添加到字典里,但是现在我认为在顶部添加一行,比如说,if arow[2] == '*' then delete it, else continue,会更容易更好

我知道应该是这样的:

for x in INFILE:
    arow = x.rstrip().split("\t")
    thisChrom = arow[2]
    thisChrompos = arow[3]
    if arow == '*': arow.remove(*)
    else:
        continue

但我没能把语法弄对。我所有的Python都是自我&;我很感激你的建议和指导。抱歉,如果这是一个过度解释的东西,是非常简单的大多数专家(我不是专家)


Tags: 字典amparowchrxchr11chr10chr17chr4
1条回答
网友
1楼 · 发布于 2024-06-16 13:57:29

continue关键字有些不明显。它所做的是跳过循环的剩余内容,并开始下一个迭代。因此,只有当arow不等于'*'时,您编写的内容才会跳过循环的其余部分

而不是

if arow == '*': arow.remove(*)
else:
    continue
# process the row

您可能只想使用一个简单的if条件:

if arow != '*':
    # process the row

或者按照您可能想要的方式使用continue

if arow == '*': continue
# process the row

看看它是如何以与你所想相反的方式工作的?另外,在这种情况下不需要else,因为continue跳过了循环的其余部分


如果您熟悉break关键字,作为比较可能更有意义。break关键字完全停止循环—它“中断”循环并继续前进。continue关键字只是它的一个“较弱”版本-它“中断”了当前的迭代,但不是完全脱离循环

相关问题 更多 >