如何搜索项目集合是否在列表中?
How to search if a collection of items are in a list?
我正在遍历一个文件,并试图确定是否在我制作的空列表中同时找到一组特定的 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']]
关于为什么会这样,我想得到一些指导。谢谢。
看起来 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 语句将 return False
.
列表不可散列,因此无法按照您想象的方式比较两者之间的相等性。列表比较可以使用 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)
我正在遍历一个文件,并试图确定是否在我制作的空列表中同时找到一组特定的 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']]
关于为什么会这样,我想得到一些指导。谢谢。
看起来 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 语句将 return False
.
列表不可散列,因此无法按照您想象的方式比较两者之间的相等性。列表比较可以使用 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)