设置差异运算符不采取差异(似乎什么也不做)?

时间:2019-06-20 00:37:00

标签: python h2o

尝试在python中做一个简单的set差异,并获得表明差异运算符什么也不做的结果。例如。有代码

python版本2.7.15 +

    assert isinstance(left_frame, h2o.H2OFrame)
    assert isinstance(right_frame, h2o.H2OFrame)
    assert isinstance(left_key, str)
    assert isinstance(right_key, str)

    # ensure that the primary_key exists in both frames
    assert left_key in left_frame.columns, 'left_key: {} does not exist in left_frame'.format(left_key)
    assert right_key in right_frame.columns, 'right_key: {} does not exist in right_frame'.format(right_key)

    # ensure that the primary_key is the only common column between the left and right frame
    left_non_pk_cols = set(left_frame.columns) - set(left_key)
    assert left_on not in left_non_pk_cols, '%s' % left_key
    right_non_pk_cols = set(right_frame.columns) - set(right_key)
    assert right_on not in right_non_pk_cols, '%s' % right_key
    left_non_pk_cols_in_right = left_non_pk_cols.intersection(right_non_pk_cols)
    assert len(left_non_pk_cols_in_right) == 0,\
        'The primary_key is not the only common column between frames, h2o merge will not work as expected\n%s\n%s\n%s' \
        % (left_non_pk_cols, right_non_pk_cols, left_non_pk_cols_in_right)

我得到了错误

    assert left_key not in left_non_pk_cols, '%s' % left_key
AssertionError: <the left_key value>

这对我来说真的很奇怪。在终端(具有相同的python版本)中运行以简化示例案例

assert u'1' not in (set([u'1', u'2', u'3']) - set(u'1'))
# noting that the H2OFrames `.columns` field is a list of unicode strings

完全没有错误,并按预期完成(打印结果set时,一切看起来都应该正确(没有u'1'元素)。

使用.difference()方法而不是-运算符也不会导致任何差异。

有人知道这里可能发生什么或做其他事情来获取更多调试信息吗?

1 个答案:

答案 0 :(得分:1)

set()的参数是一个可迭代的,它创建了该可迭代的每个元素的集合。因此,如果left_key是字符串,set(left_key)将创建该字符串的每个唯一字符的集合,而不是其元素是该字符串的集合。

解决方案是使用set([left_key])。参数将是列表,然后集合将包含其单个元素字符串。或者,您可以只使用一组文字{left_key}

left_non_pk_cols = set(left_frame.columns) - {left_key}

另一种方法是从集合中删除元素。

left_non_pk_cols = set(left_frame.columns)
left_non_pk.cols.discard(left_key)

我使用discard而不是remove,因为如果找不到元素,它不会发出错误信号。