2016-11-09 56 views
5

我有一個包含單個項目的集合,在這種情況下的字符串:如何在包含單一項目的一組檢索唯一項目

b = Set(["A"]) 

我想拿到單項出來。這樣做的最好方法是什麼?我可以找出做到這一點的唯一方法是使用一個循環:

single_item = "" 
for item in b 
    single_item = item 
end 

它得到我什麼,我需要

julia> single_item 
"A" 

,但我覺得必須有一個更簡單的方法。

回答

5

我建議first

julia> b = Set(["A"]) 
Set(ASCIIString["A"]) 

julia> first(b) 
"A" 

我們可以分析這個,看看分配數量。 (因爲內存分配很慢)。由於這是一次運行,我會忽略實際的時間。 顯示的結果是每次調用的第二次運行。 b宣佈爲const

julia> @time first(b) 
    0.000003 seconds (4 allocations: 160 bytes) 
"A" 


julia> @time collect(b)[1] 
    0.000005 seconds (5 allocations: 240 bytes) 
"A" 


julia> @time first(next(b,start(b))) 
    0.000007 seconds (5 allocations: 192 bytes) 
"A" 
+0

謝謝@Oxinabox,不記得'first'這個變種。 「第一(b)」的分配實際上是一種測量工件,沒有進行分配。查看執行內部甚至可以使用以下實現再次實現性能:'getsingleton(x :: Set {String})= x.dict.count == 1? x.dict.keys [findfirst(x.dict.slots,0x1)]:throw(ArgumentError(「must be a singleton」))'。加載BenchmarkTools包後使用'@benchmark getsingleton(b)'。 –

+0

是的,我打算這樣評論,但分心了。謝謝。隨意編輯。 –

6

怎麼樣

julia> collect(b)[1] 
"A" 

編輯

傳說中的丹·蓋茨的建議,可考慮做

julia> collect(take(b,1))[1] 
"A" 

如果記憶是一個問題

+0

啊哈,收集變成一個數組,我不知道。謝謝,那太好了! –

+1

這可能可以爲'collect(b)'分配一個完整的向量。 'collect(take(b,1))[1]'可能更有效率,甚至更低級別:'first(next(b,start(b)))' –

+0

風格瑣事:我看到人們更喜歡當預期列表中只有一個項目時,使用'[]'而不是'[1]'作爲指示這種情況的直觀方式。 –

相關問題