def generateStringPairs(x1, x2):
    """
    Returns: list *WITHOUT* duplicates of strings where the first part 
    of each string is an element of x1 and the second part is an element of x2.

    Ex: x1 = ["a", 2, "a", "cat"], x2 = [17, "dog"]
        output = ["a17", "adog", "217", "2dog", "cat17", "catdog"]

    Preconditions (no need to assert these):
    x1 and x2 are non-empty lists of strings AND/OR ints (possibly mixed)

    You may NOT use the set() function (if you even know what it is).
    """
    pass

if __name__ == '__main__':
    print("trying out generateStringPairs()")

    x1 = ["a", 2, "a", "cat"]; x2 = [17, "dog"]

    result = sorted(generateStringPairs(x1, x2))
    expected = sorted(["a17", "adog", "217", "2dog", "cat17", "catdog"])

    assert result == expected, "Bad result for 'normal' case: " + \
        "Expected contains "+ str(expected) + "; result contains " + str(result)

    # Example where neither input list has duplicates, but
    # the output list would if not checked
    x1 = ["c", "ca"]; x2 = ["at", "t"]
    result = sorted(generateStringPairs(x1, x2))
    expected = sorted(["cat", "ct", "caat"])

    assert result == expected, "Bad result for tricker case: " + \
        "Expected contains "+ str(expected) + "; result contains " + str(result)

    print("All checks passed")