set - 用 python 订购东西......?

标签 set python-2.7

我的印象是 set() 会像 .sort() 一样对集合进行排序

然而似乎并非如此,对我来说奇怪的是它为什么对集合进行重新排序。

>>> h = '321'
>>> set(h)
set(['1', '3', '2'])
>>> h
'321'
>>> h = '22311'
>>> set(h)
set(['1', '3', '2'])

为什么它不返回 set(['1', '2', '3'])。我还认为,无论我使用每个数字有多少个实例,或者以什么顺序使用它们,它总是返回 set(['1', '3', '2'])。为什么?

编辑:

所以我已经阅读了您的回答,我对此的反驳是这样的。

>>> l = [1,2,3,3]
>>> set(l)
set([1, 2, 3])
>>> l = [3,3,2,3,1,1,3,2,3]
>>> set(l)
set([1, 2, 3])

为什么它对数字而不是字符串进行排序?

还有

import random
l = []
for itr in xrange(101):
    l.append(random.randint(1,101))

print set(l)

输出

>>> 
set([1, 2, 4, 5, 6, 8, 10, 11, 12, 14, 15, 16, 18, 19, 23, 24, 25, 26, 29, 30, 31, 32, 34, 40, 43, 45, 46, 47, 48, 49, 50, 51, 53, 54, 55, 57, 58, 59, 60, 61, 62, 63, 64, 66, 67, 69, 70, 74, 75, 77, 79, 80, 83, 84, 85, 87, 88, 89, 90, 93, 94, 96, 97, 99, 101])

最佳答案

python set 是无序的,因此不能保证元素的排序方式与您指定的方式相同

如果您想要排序的输出,请调用排序:

sorted(set(h))

回应您的编辑:这归结为 set 的实现。在 CPython 中,它可以归结为两件事:

1) 该集合将按哈希(__hash__ 函数)以限制为模进行排序

2) 极限通常是下一个最大的 2 次方

让我们看看 int 的情况:

x=1
type(x) # int
x.__hash__() # 1

对于整数,哈希值等于原始值:

[x==x.__hash__() for x in xrange(1000)].count(False) # = 0

因此,当所有值都是整数时,它将使用整数哈希值,一切顺利。

对于字符串表示形式,哈希值的工作方式不同:

x='1'
type(x)  
# str
x.__hash__()
# 6272018864

要了解 ['1','2','3'] 排序中断的原因,请查看这些哈希值:

[str(x).__hash__() for x in xrange(1,4)]
# [6272018864, 6400019251, 6528019634]

在我们的示例中,mod 值为 4(3 个元素,2^1 = 2, 2^2 = 4),因此

[str(x).__hash__()%4 for x in xrange(1,4)]
# [0, 3, 2]
[(str(x).__hash__()%4,str(x)) for x in xrange(1,4)]
# [(0, '1'), (3, '2'), (2, '3')]

现在,如果你对这个野兽进行排序,你会得到你在集合中看到的顺序:

[y[1] for y in sorted([(str(x).__hash__()%4,str(x)) for x in xrange(1,4)])]
# ['1', '3', '2']

关于set - 用 python 订购东西......?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7129778/

相关文章:

java - 如何确定位置 Z 是否在起点 X 和终点 Y 的区域内

javascript - 如何动态设置 Javascript 对象值?

python - 在 python 中发送 GET 请求的有效负载

python - Matplotlib : Could not convert string to float

algorithm - 快速集重叠匹配算法

mysql - 在mysql中将初始总和设置为零

python - 用 Python 逐行写一个文本文件

python - 如何在 Python 中使用正则表达式和 re.sub 查找所有出现的 unicode 字符的大写和小写字母?

python - 如何为单元测试模拟缓冲文件句柄

javascript - 如何在集合中查找数组的存在?