为什么Python无法识别集合中的元素?

时间:2014-05-24 22:45:53

标签: python

我正在尝试从一组字符串中删除元素,但是找不到它们。 该集合作为冻结集(由超出问题范围的库)生成,我将其转换为常规集。

>>> 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

2 个答案:

答案 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)