删除依赖于一列Python的行

时间:2015-07-27 15:35:28

标签: python

我正在逐步拆开一个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都是自我和stackoverflow教,所以我感谢您的建议和指导。对不起,如果这是对大多数专家非常简单的事情的过度解释(我不是专家)。

1 个答案:

答案 0 :(得分:1)

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关键字只是一个“弱”"版本 - 它"打破"超出当前的迭代但不是完全退出循环。