Python&;生物学:使用python交叉数据集

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

我喜欢这个网站。我是一名生物学家,会回答一些简单的问题,让它们在python中变得错综复杂,而现在我却被困在一个相当简单的问题上。我有两个不相等的元组列表,其中包含染色体('chr#')和位置('start','end')信息:

列表1:length=1499,tuples=('chr5','12345','12678')

列表2:length=75220,tuples=('chr5','44','777')

如果有人能向我解释这段代码失败的原因,我可以自己解决:

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)