如何搜索列表中某一组项目是否存在?

2024-09-30 14:34:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在遍历一个文件,并试图确定是否在我创建的一个空列表中找到了一组特定的3项(来自该文件);如果没有,我想附加它们。如果它们已经出现,我想跳过它们

但是,当我运行以下代码时:

from pprint import pprint as pp

targets = open(file)

longest_UTR = []

counter = 0

for line in targets:

    (chromosome, locus, mir, gene, transcript, UTR_length) = line.strip("\n").split("\t")

    if [locus, mir, gene] not in longest_UTR:

        longest_UTR.append([locus, mir, gene, transcript, UTR_length])

    counter += 1

    if counter == 100:

        break

pp (longest_UTR)

我发现输出包含重复项,即它没有跳过项目组,即使它们出现在空列表中(如下面的箭头所示)

['CFI', 'hsa-miR-576-5p', 'DIS3', 'ENST00000490646', '2934'],
['APOE', 'hsa-miR-642a-5p', 'WDR64', 'ENST00000425826', '2122'],
>['C2/CFB/SKIV2L', 'hsa-miR-219a-1-3p', 'GLG1', 'ENST00000422840', '4748'],
['C2/CFB/SKIV2L', 'hsa-miR-219a-1-3p', 'GLG1', 'ENST00000422840', '4748']<,
['APOE', 'hsa-miR-330-3p', 'DCAF4L1', 'ENST00000333141', '4764'],
['TMEM97/VTN', 'hsa-miR-144-3p', 'DCAF4L1', 'ENST00000333141', '4764']]

我想知道为什么会出现这种情况。多谢各位


Tags: 文件in列表longestlinecounterpppprint
2条回答

列表是不可散列的,因此不能按照您认为的方式来比较两者之间的相等性。列表比较可以使用sets代替

从pprint导入pprint作为pp

targets = open(file)

longest_UTR = []

for line in targets:
    chromosome, locus, mir, gene, transcript, UTR_length = line.strip("\n").split("\t")

    if not [set([locus, mir, gene]) < set(utr) for utr in longest_UTR]:
        longest_UTR.append([locus, mir, gene, transcript, UTR_length)])
pp (longest_UTR)

看起来longest_UTR将是一个列表列表。if语句if [locus, mir, gene] not in longest_UTR将在longest_UTR中搜索列表[locus, mir, gene],并且永远不会找到它,因为longest_UTR中的子列表都是长度为5的

相反,您可以只搜索每个子列表的前3个元素:

if not any(x[:3] == [locus, mir, gene] for x in longest_UTR):

你应该知道元素的顺序在这里很重要。类似地,如果longest_UTR有一些列表,前3个元素为[mir, locus, gene],那么这个if语句将返回False

相关问题 更多 >