Python&;生物学:使用python交叉数据集
我喜欢这个网站。我是一名生物学家,会回答一些简单的问题,让它们在python中变得错综复杂,而现在我却被困在一个相当简单的问题上。我有两个不相等的元组列表,其中包含染色体('chr#')和位置('start','end')信息: 列表1:length=1499,tuples=('chr5','12345','12678') 列表2:length=75220,tuples=('chr5','44','777') 如果有人能向我解释这段代码失败的原因,我可以自己解决:Python&;生物学:使用python交叉数据集,python,list,Python,List,我喜欢这个网站。我是一名生物学家,会回答一些简单的问题,让它们在python中变得错综复杂,而现在我却被困在一个相当简单的问题上。我有两个不相等的元组列表,其中包含染色体('chr#')和位置('start','end')信息: 列表1:length=1499,tuples=('chr5','12345','12678') 列表2:length=75220,tuples=('chr5','44','777') 如果有人能向我解释这段代码失败的原因,我可以自己解决: list1 = [('chr1
list1 = [('chr1', '123', '345'), ('chr1', '567', '678'), ('chr2', '123', 234'),...)
list2 = [('chr1', '123', '567'), ('chr1', '777', '890'), ('chr2', '1', 288'),...)
newlist = []
for j,k,l in list1:
if j == x for x,y,z in list2:
if int(k) >= int(y) or int(l) <= int(z):
newlist.append(k)
else:
pass
else:
pass
list1=[('chr1','123','345'),('chr1','567','678'),('chr2','123',234'),…)
列表2=[('chr1','123','567'),('chr1','777','890'),('chr2','1','288'),…)
新列表=[]
对于列表1中的j、k、l:
如果列表2中x,y,z的j==x:
如果int(k)>=int(y)或int(l)
这就是你要找的吗?:)
如果您还需要比较数字:
if list1[0] == list2[0]:
for i in range(1, min([len(list1), len(list2)]):
if int(list1[i]) < int(list2[i]):
print('Aha!')
如果list1[0]==list2[0]:
对于范围内的i(1,min([len(列表1),len(列表2)]):
如果int(列表1[i])
如果更改代码中的第一个if语句,使其不在第二个for循环之前,则代码将运行:
list1 = [('chr1', '123', '345'), ('chr1', '567', '678'), ('chr2', '123', '234')]
list2 = [('chr1', '123', '567'), ('chr1', '777', '890'), ('chr2', '1', '288')]
newlist = []
for j,k,l in list1:
for x,y,z in list2:
if j == x:
if int(k) >= int(y) or int(l) <= int(z):
newlist.append(k)
else:
pass
else:
pass
list1=[('chr1','123','345'),('chr1','567','678'),('chr2','123','234')]
列表2=[('chr1','123','567'),('chr1','777','890'),('chr2','1','288')]
新列表=[]
对于列表1中的j、k、l:
对于列表2中的x、y、z:
如果j==x:
如果int(k)>=int(y)或int(l)我的帖子没有回答你的问题,但我认为你的代码可以通过使用更多的pythonic构造来改进。朝这个方向迈出的第一步是使用命名元组,这样染色体字段就可以通过它们的属性名称、开始和结束来访问:
在第二步中,可以使用列表理解来减少嵌套循环的数量:
from collections import namedtuple
Chromosome = namedtuple('Chromosome', ['name', 'start', 'end'])
list1 = [Chromosome('chr1', 123, 345), Chromosome('chr1', 567, 678), ]
list2 = [Chromosome('chr1', 123, 567), Chromosome('chr2', 1, 288), ]
newlist = []
for chromo1 in list1:
# Build a list of chromosomes from list2 that
# * have the same name as chromo1
# * start before chromo1
# * end after chromo1
matches = [chromo2 for chromo2 in list2
if chromo2.name == chromo1.name and
(chromo2.start < chromo1.start or chromo2.end > chromo1.end)]
newlist.extend(matches)
从集合导入namedtuple
染色体=namedtuple('染色体',['name','start','end']))
列表1=[染色体('chr1',123345),染色体('chr1',567678),]
清单2=[染色体('chr1',123567),染色体('chr2',1288),]
新列表=[]
对于列表1中的chromo1:
#从列表2中构建一个染色体列表
#*与chromo1同名
#*在1号之前开始
#*在1之后结束
matches=[chromo2,用于列表2中的chromo2
如果chromo2.name==chromo1.name和
(chromo2.startchromo1.end)]
newlist.extend(匹配项)
没错,你只需要简单的问题,然后让它们变得复杂。这个问题太复杂了,你似乎是唯一能回答的人。请允许我编辑成一个更简单的形式,对不起!我希望这样会更好!无需重新发明轮子(无论如何,Python是错误的工具)。如果您试图找到基因组范围之间的重叠,请使用专用工具(如BEDOPS),该工具在这种和类似的集合操作中非常有效:例如,确定元素chr5 12345 12678
,chr5 44 77777
)等。重叠时,您可以将它们放入以制表符分隔的BED文件中,使用sor对它们进行排序t-bed
,然后运行bedmap--echo--count foo.bed
来计算重叠的数量。如果一个元素的计数大于零,那么它就有一个重叠。您可以添加--echo map
选项来列出重叠的元素。数字比较代码可能确实是我正在寻找的。我编辑了这个问题,以便其他元素都可以使用r人类可以理解它很有趣,我将与namedTuple一起玩。非常感谢您的回复,非常感谢!
from collections import namedtuple
Chromosome = namedtuple('Chromosome', ['name', 'start', 'end'])
chromo = Chromosome('chr1', 123, 345)
# You can access the fields as chromo.name, chromo.start and chromo.end
from collections import namedtuple
Chromosome = namedtuple('Chromosome', ['name', 'start', 'end'])
list1 = [Chromosome('chr1', 123, 345), Chromosome('chr1', 567, 678), ]
list2 = [Chromosome('chr1', 123, 567), Chromosome('chr2', 1, 288), ]
newlist = []
for chromo1 in list1:
# Build a list of chromosomes from list2 that
# * have the same name as chromo1
# * start before chromo1
# * end after chromo1
matches = [chromo2 for chromo2 in list2
if chromo2.name == chromo1.name and
(chromo2.start < chromo1.start or chromo2.end > chromo1.end)]
newlist.extend(matches)