我正在逐步拆开一个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教,所以我感谢您的建议和指导。对不起,如果这是对大多数专家非常简单的事情的过度解释(我不是专家)。
答案 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
关键字只是一个“弱”"版本 - 它"打破"超出当前的迭代但不是完全退出循环。