Итеративный порядок наборов в Python

Если у меня есть два идентичных набора, имея в виду a == b дает мне True, у них будет тот же итеративный порядок? Я попробовал его, и это работает:

>>> foo = set("abc")
>>> bar = set("abc")
>>> zip(foo, bar)
[('a', 'a'), ('c', 'c'), ('b', 'b')]

Мой вопрос, действительно ли я был удачлив, или это поведение гарантируется?

17
задан Björn Pollex 4 August 2010 в 14:08
поделиться

5 ответов

Это не было просто совпадение, что они вышли одинаковыми: реализация оказывается детерминированной, поэтому создание одного и того же набора дважды приводит к одинаковому порядку. Но Python этого не гарантирует.

Если вы создаете один и тот же набор двумя разными способами:

n = set("abc")
print n

m = set("kabc")
m.remove("k")
print m

... вы можете получить другой порядок:

set(['a', 'c', 'b'])
set(['a', 'b', 'c'])
21
ответ дан 30 November 2019 в 12:35
поделиться

Да, вам повезло. См., Например:

import random
r = [random.randint(1,10000) for i in range(20)]
foo = set(r)
r.sort(key=lambda _: random.randint(1,10000))
bar = set(r)
print foo==bar
print zip(foo, bar)

Что дало мне результат:

True
[(3234, 3234), (9393, 9393), (9361, 1097), (1097, 5994), (5994, 2044), (1614, 1614), (6074, 4377), (4377, 9361), (5202, 5202), (2355, 2355), (1012, 1012), (7349, 7349), (6198, 6198), (8489, 8489), (7929, 7929), (6556, 6074), (6971, 6971), (2044, 6556), (7133, 7133), (383, 383)]
1
ответ дан 30 November 2019 в 12:35
поделиться

№:

>>> class MyStr( str ):
...     def __hash__( self ):
...             return 0
...
>>> a = MyStr( "a" )
>>> b = MyStr( "b" )
>>> c = MyStr( "c" )
>>> foo = { a, b, c }
>>> foo
{'c', 'b', 'a'}
>>> bar = { b, a, c }
>>> foo is bar
False
>>> foo ==  bar
True
>>> list( zip( foo, bar ) )
[('c', 'c'), ('b', 'a'), ('a', 'b')]

P.S. Понятия не имею, требуется ли переопределение __ hash __ . Я просто попробовал что-то, что, как я думал, сломает это, и это сработало.

4
ответ дан 30 November 2019 в 12:35
поделиться

Я бы сказал, вам повезло. Хотя может также случиться так, что, поскольку элементы в наборе были одинаковыми, они хранились в том же порядке. На такое поведение не стоит полагаться.

0
ответ дан 30 November 2019 в 12:35
поделиться

Вам повезло, порядок не гарантирован. Единственное, что гарантировано, это то, что в наборах будут одинаковые элементы.

Если вам нужна какая-то предсказуемость, вы можете отсортировать их следующим образом: zip(sorted(foo), sorted(bar)).

4
ответ дан 30 November 2019 в 12:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: