2016-11-09 63 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]'作为指示这种情况的直观方式。 –

相关问题