gpt4 book ai didi

python - 根据同一列表中的下一个项目从列表中删除项目

转载 作者:IT老高 更新时间:2023-10-28 20:39:58 24 4
gpt4 key购买 nike

我刚开始学习 python,这里有一个排序的蛋白质序列列表(总共 59,000 个序列),其中一些是重叠的。例如,我在这里做了一个玩具 list :

ABCDE
ABCDEFG
ABCDEFGH
ABCDEFGHIJKLMNO
CEST
DBTSFDE
DBTSFDEO
EOEUDNBNUW
EOEUDNBNUWD
EAEUDNBNUW
FEOEUDNBNUW
FG
FGH

我想删除那些较短的重叠并只保留最长的重叠,以便所需的输出如下所示:

ABCDEFGHIJKLMNO
CEST
DBTSFDEO
EAEUDNBNUW
FEOEUDNBNUWD
FGH

我该怎么做?我的代码如下所示:

with open('toy.txt' ,'r') as f:
pattern = f.read().splitlines()
print pattern

for i in range(0, len(pattern)):
if pattern[i] in pattern[i+1]:
pattern.remove(pattern[i])
print pattern

我收到了错误消息:

['ABCDE', 'ABCDEFG', 'ABCDEFGH', 'ABCDEFGHIJKLMNO', 'CEST', 'DBTSFDE', 'DBTSFDEO', 'EOEUDNBNUW', 'EAEUDNBNUW', 'FG', 'FGH']
['ABCDEFG', 'ABCDEFGH', 'ABCDEFGHIJKLMNO', 'CEST', 'DBTSFDE', 'DBTSFDEO', 'EOEUDNBNUW', 'EAEUDNBNUW', 'FG', 'FGH']
['ABCDEFG', 'ABCDEFGHIJKLMNO', 'CEST', 'DBTSFDE', 'DBTSFDEO', 'EOEUDNBNUW', 'EAEUDNBNUW', 'FG', 'FGH']
['ABCDEFG', 'ABCDEFGHIJKLMNO', 'CEST', 'DBTSFDE', 'DBTSFDEO', 'EOEUDNBNUW', 'EAEUDNBNUW', 'FG', 'FGH']
['ABCDEFG', 'ABCDEFGHIJKLMNO', 'CEST', 'DBTSFDEO', 'EOEUDNBNUW', 'EAEUDNBNUW', 'FG', 'FGH']
['ABCDEFG', 'ABCDEFGHIJKLMNO', 'CEST', 'DBTSFDEO', 'EOEUDNBNUW', 'EAEUDNBNUW', 'FG', 'FGH']
['ABCDEFG', 'ABCDEFGHIJKLMNO', 'CEST', 'DBTSFDEO', 'EOEUDNBNUW', 'EAEUDNBNUW', 'FG', 'FGH']
['ABCDEFG', 'ABCDEFGHIJKLMNO', 'CEST', 'DBTSFDEO', 'EOEUDNBNUW', 'EAEUDNBNUW', 'FGH']
Traceback (most recent call last):
File "test.py", line 8, in <module>
if pattern[i] in pattern[i+1]:
IndexError: list index out of range

最佳答案

还有其他可行的答案,但没有一个能解释您的实际问题。您实际上非常接近有效的解决方案,而在我看来,最易读的答案是什么。

错误是因为您在使用 range() 检查索引时更改了同一个列表。

因此,在增加 i 变量的同时,您从列表中删除了在某一时刻不可避免地导致 index error 的项目。

因此,这是您的初始代码的工作版本,并进行了一些更改,

pattern = ["ABCDE","ABCDEFG","ABCDEFGH","ABCDEFGHIJKLMNO","CEST","DBTSFDE","DBTSFDEO","EOEUDNBNUW","EAEUDNBNUW","FG","FGH"]
output_pattern = []


for i in range(0, (len(pattern)-1)):
if not pattern[i] in pattern[i+1]:
output_pattern.append(pattern[i])

# Adding the last item
output_pattern.append(pattern[-1])
print (output_pattern)

>>>> ['ABCDEFGHIJKLMNO', 'CEST', 'DBTSFDEO', 'EOEUDNBNUW', 'EAEUDNBNUW', 'FGH']

请注意,如果您的列表之前按照您在评论部分中提到的那样排序,则此代码将起作用。

这段代码在做什么?

基本上,它使用与您的初始答案相同的逻辑,在列表中迭代并检查下一项是否包含当前项。但是,使用另一个列表并迭代直到 before last 项,将解决您的索引问题。但是现在有一个问题,

我应该如何处理最后一项?

由于列表已排序,您可以认为最后一项始终是唯一的。这就是我使用的原因

output_pattern.append(pattern[-1])

添加初始列表的最后一项。

重要提示

这个答案是针对 OP 最初的问题而写的,他想保持更长的重叠,我根据同一列表中的下一个项目引用 。正如@Chris_Rands 所述,如果您的担忧与生物学任务相关并且需要找到任何重叠,则此解决方案不适合您的需求。

此代码无法识别潜在重叠的示例,

pattern = ["ACD", "AD", "BACD"]

在不删除可能的 "ACD" 重叠的情况下输出相同的结果。现在,作为一个澄清,这将意味着一个更复杂的算法,我最初认为它超出了问题要求的范围。如果这是你的情况,我可能完全错了,但我真的认为 C++ 实现似乎更合适。看看@Chris_Rands 在评论部分建议的 CD-Hit 算法。

关于python - 根据同一列表中的下一个项目从列表中删除项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51327765/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com