Set Types

A set object is an unordered collection of distinct hashable objects. Common uses include membership testing, removing duplicates from a sequence, and computing mathematical operations such as intersection, union, difference, and symmetric difference. There are two built-in types in Python: set and frozenset. However, both types are not supported in RPython.

Attention

sets are not directly supported in RPython. Instead you should use a plain dict and fill the values with None. Values in that dict will not consume space.

Right now, we can use dict to simulate a set.

def sets():
    # Since set is not supported in RPython, we use dict with None as values to
    # simulate a set.
    s1 = {'foo': None, 'bar': None, 'baz': None, 'foo': None, 'baz': None}
    if 'fooo' not in s1: print 'fooo is not in the set s1'
    if 'foo' in s1: print 'foo is in the set s1'
    for i in s1: print i

    s2 = {'foo': None, 'hello': None, 'world': None, 'foo': None}

    # union
    def set_union(s1, s2):
        s3 = s1.copy()
        s3.update(s2)
        return s3

    print 'union:'
    s3 = set_union(s1, s2)
    for i in s3: print i

    # intersection:
    def set_intersection(s1, s2):
        s3 = {}
        for i in s1:
            if i in s2:
                s3.update({i: None})

        for i in s2:
            if i in s1:
                s3.update({i: None})
        return s3

    print 'intersection:'
    s3 = set_intersection(s1, s2)
    for i in s3: print i

def entry_point(argv):
    sets()
    return 0

def target(*args): return entry_point
if __name__ == "__main__":
    import sys
    entry_point(sys.argv)

All set operations and methods in the following code are not supported in RPython.

################### UNSUPPORTED IN RPYTHON ######################

def sets_unsupported():
    s1 = set(['foo', 'bar', 'baz', 'foo'])
    s2 = set(['foo', 'hello', 'world', 'foo'])
    if 'fooo' not in s1: print 'fooo is not in the set s1'
    if 'foo' in s1: print 'foo is in the set s1'
    print s1

    # union
    print s1.union(s2)
    print s1 | s2

    # intersection
    print s1.intersection(s2)
    print s1 & s2

    # difference
    print s1.difference(s2)
    print s1 - s2

    # symmetric difference
    print s1.symmetric_difference(s2)
    print s1 ^ s2

    # whether or not two sets have any elements in common
    print s1.isdisjoint(s2)

    # whether one set is a subset/superset of the other
    print s1.issubset(s2)
    print s1 <= s2
    print s1.issubset(s2)
    print s1 >= s2

    # whether on set is a proper subset/superset of the other
    print s1 < s2
    print s1 > s2

    # modifying a set
    s1 |= s2
    s1.update(['fob', 'bah'])
    s1.add('boz')
    s1.remove('boz')
    s1.pop()
    s2.clear()
    print s1

    fs = frozenset(['foo', 'bar', 'baz'])    # frozenset is immutable
    print fs

def entry_point(argv):
    sets_unsupported()
    return 0

def target(*args): return entry_point
if __name__ == "__main__":
    import sys
    entry_point(sys.argv)