Python 關於set的數字元素的順序問題

2021-10-19 06:58:08 字數 1703 閱讀 6140

無序的這個是str.isspace,看似有序的是str.isascii,除了shell輸入set的變數,是有序顯示,但是無論是str()還是repr()還是list(),並非順序顯示

print

(d['isspace'])

print

(d['isascii'])

s='isspace'

r=set()

f=eval

('str.%s'

%s)for i in

range

(0x110000):

if f(

chr(i)

):r.add(i)

rout[95]

:

猜測上面是使用了不定長的hash值,雖然我使用python的hash函式,正整數的話,數值就是他本身,如果是按照其進行排序的話,應該是順序,要麼不是這種hash表。總之,相挨的數倒是順序的。

但奇妙的事情:

s=

set(

)for i in

range

(100,10

,-5)

: s.add(i)

repr

(s)out[

106]:''

sys.getsizeof(s)

out[

165]

:728

for i in

range(10

,15):

s.add(i)

repr

(s)out[

109]:''

sys.getsizeof(s)

out[

166]

:2264

for i in

range(10

,15):

s.remove(i)

repr

(s)out[

115]:''

sys.getsizeof(s)

out[

167]

:2264

開始時,我使用了倒敘的賦值,順序是亂的,之後複製了一串數,順序掙了,之後移除了那些數,數居然還是有序的

之後我獲取了集合的大小,最開始集合的大小是728,亂序,增加了5個元素後,順序,大小2264,去掉這5個元素後,仍是順序,大小仍是2264。

那麼最初的集合和現在的集合一樣嗎?

s1=

set(

)for i in

range

(100,10

,-5)

: s1.add(i)

s1==s

out[

169]

:true

repr

(s1)

out[

170]:''

repr

(s)out[

171]

:''

自然是一樣的,但內部結構卻不一樣

前後使用了不同量級的雜湊表,在這個雜湊表中,乙個單元覆蓋了所有的數值,所以這一段數值是順序的,這個集合貌似可以直接當作順序的復合型別使用。

但是,如果加入的元素無法讓雜湊表量級變化,仍是散的單元,這堆資料就是看似亂序的,雖然有一小塊一小塊的順序。

結論就是,如果是完全步進1的順序序列,可以用set排序,但這依舊是旁門左道。如果有步進,你是無法確定生成的set內部是否是順序的!

刪除List中的非數字元素

由於list的非執行緒安全特性,在遍歷list的過程中,隨意刪除某個元素是一件很危險的事情,所以在寫 hello world 的時候需要注意一下.function 1.0 使用pattern類可以匹配正規表示式 pattern pattern pattern.compile 0 9 boolean ...

python練習題6 4列表數字元素加權和 1

輸入乙個巢狀列表,巢狀層次不限,根據層次,求列表元素的加權和。第一層每個元素 的值為 元素值 1,第二層每個元素的值為 元素值 2,第三層每個元素的值為 元素值 3,以此類推!輸入格式 在一行中輸入列表 輸出格式 在一行中輸出加權和 如下 usr bin python coding utf 8 de...

找出數字元素的下標 歡聚時代2017校招筆試題目

讀入乙個有n個數的整形陣列,並給出乙個和值sum,判斷是否存在兩個數字使得它們的和為sum。輸入資料報括兩行 第一行兩個整數n 1 n 1000 sum 1 sum 10 9 第二行n個整數,範圍均在32位整數內,以空格分隔 如果找到和值為某值的兩個數,輸出兩個數字的下標 陣列下標從0開始 如果有多...