我有一个包含单个项目的集合,在这种情况下的字符串:如何在包含单一项目的一组检索唯一项目
b = Set(["A"])
我想拿到单项出来。这样做的最好方法是什么?我可以找出做到这一点的唯一方法是使用一个循环:
single_item = ""
for item in b
single_item = item
end
它得到我什么,我需要
julia> single_item
"A"
,但我觉得必须有一个更简单的方法。
我有一个包含单个项目的集合,在这种情况下的字符串:如何在包含单一项目的一组检索唯一项目
b = Set(["A"])
我想拿到单项出来。这样做的最好方法是什么?我可以找出做到这一点的唯一方法是使用一个循环:
single_item = ""
for item in b
single_item = item
end
它得到我什么,我需要
julia> single_item
"A"
,但我觉得必须有一个更简单的方法。
我建议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"
怎么样
julia> collect(b)[1]
"A"
编辑
传说中的丹·盖茨的建议,可考虑做
julia> collect(take(b,1))[1]
"A"
如果记忆是一个问题
啊哈,收集变成一个数组,我不知道。谢谢,那太好了! –
这可能可以为'collect(b)'分配一个完整的向量。 'collect(take(b,1))[1]'可能更有效率,甚至更低级别:'first(next(b,start(b)))' –
风格琐事:我看到人们更喜欢当预期列表中只有一个项目时,使用'[]'而不是'[1]'作为指示这种情况的直观方式。 –
谢谢@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)'。 –
是的,我打算这样评论,但分心了。谢谢。随意编辑。 –