Equal sets with unequal print and str() representations

Ben Finney ben+python at benfinney.id.au
Sun Oct 16 22:23:47 EDT 2011


Ganesh Gopalakrishnan <ganesh at cs.utah.edu> writes:

> This probably is known, but a potential pitfall (was, for me) nevertheless.
> I suspect it is due to hash collisions between 's3' and 's13' in this
> case?

What is the actual problem? What behaviour is occurring that doesn't
match your expectation?

> >>> S1==S2
> S1==S2
> True
> >>> str(S1)
> str(S1)
> "{'s8', 's13', 's2', 's0', 's7', 's6', 's4', 's3', 's14'}"
> >>> str(S2)
> str(S2)
> "{'s8', 's3', 's2', 's0', 's7', 's6', 's4', 's13', 's14'}"
> >>> str(S1) == str(S2)
> False

Right, that's all correct (though I don't know why some of your
expressions are being shown twice). A deliberate property of a set is
that its items are unordered.
    <URL:http://docs.python.org/library/stdtypes.html#set>

Since sets are unordered, the string representation may show the items
in an arbitrary and unpredictable sequence. Don't write any code that
depends on a predictable sequence of retrieval from an unordered
collection.

So what did you expect instead, and what supports that expectation?

-- 
 \         “When we pray to God we must be seeking nothing — nothing.” |
  `\                                          —Saint Francis of Assisi |
_o__)                                                                  |
Ben Finney



More information about the Python-list mailing list