我正在尝试从一组字符串中删除元素,但是找不到它们。 该集合作为冻结集(由超出问题范围的库)生成,我将其转换为常规集。
>>> geneset = model.reactions[2915].genes
>>> geneset
frozenset(['YGL080W', 'YGR243W', 'YHR162W', 'AND', 'OR'])
>>> geneset_mutable = set(geneset)
>>> geneset_mutable
set(['YGR243W', 'OR', 'YGL080W', 'AND', 'YHR162W'])
>>> 'OR' in geneset_mutable
False
>>> "OR" in geneset_mutable
False
>>> geneset_mutable.remove('OR')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'OR'
该集合是可编辑的:
>>> geneset_mutable.add('OR')
>>> "OR" in geneset_mutable
True
>>> geneset_mutable.remove('OR')
>>> "OR" in geneset_mutable
False
>>> geneset_mutable
set(['YGR243W', 'AND', 'YHR162W', 'OR', 'YGL080W'])
>>> geneset_mutable.remove('OR')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'OR'
为什么找不到元素? 有什么特别的方法可以调试吗?
记录:
>>> sys.getdefaultencoding()
python -V
Python 2.7.5
答案 0 :(得分:4)
如果你直接输入集合,它可以正常工作:
geneset_mutable = set(['YGR243W', 'OR', 'YGL080W', 'AND', 'YHR162W'])
>>> "OR" in geneset_mutable
True
我得出结论:model.reactions[2915].genes
没有返回字符串,它返回 repr 看起来像&#34; OR&#34;但它是一种不同类型的对象(与您的查询不匹配的对象)。
这很容易确认,只需运行这样的测试:
for gene in geneset:
if repr(gene) == 'OR':
print repr(gene)
print type(gene)
print gene == 'OR'
解决方案是创建一个 gene 对象,该对象可以与该集合的成员完全匹配。如何执行此操作取决于模型的实现方式,但它应如下所示:
>>> geneset = model.reactions[2915].genes
>>> Gene('OR') in geneset
True
希望这会让你回到完成基因分析的道路上: - )
答案 1 :(得分:2)
当我逐字复制您的命令时,'OR' in geneset_mutable
会返回True
。我想知道是否有一些不可打印的字符跟踪你的集合中的元素。请尝试以下方法:
new_set = set(map(lambda x: x.strip(), set(geneset)))
'OR' in new_set
现在评估为True
吗?
如果这不起作用,我也会尝试set(geneset).add('OR')
。您很可能会在集合中看到'OR'
两次,表示它不是您认为的'或'。
最后,由于Python是强类型的,您可以尝试在geneset中打印每个元素的类型。
for i in geneset:
print type(i)