在Python中,可以读取字典/散列键,同时将键设置为默认值(如果尚不存在)。
例如:
>>> d={'key': 'value'}
>>> d.setdefault('key', 'default')
'value' # returns the existing value
>>> d.setdefault('key-doesnt-exist', 'default')
'default' # sets and returns default value
>>> d
{'key-doesnt-exist': 'default', 'key': 'value'}
有没有相当于Ruby哈希?如果没有,Ruby中的惯用方法是什么?
哈希可以具有默认值或默认值(当密钥不存在时调用)。
h = Hash.new("hi")
puts h[123] #=> hi
# change the default:
h.default = "ho"
在上面的情况下,散列保持为空。
h = Hash.new{|h,k| h[k] = []}
h[123] << "a"
p h # =>{123=>["a"]}
Hash.new([])
因为相同的数组(与相同的对象相同)将用于每个键,所以不会有效。
哈希可以具有默认值或默认值(当密钥不存在时调用)。
h = Hash.new("hi")
puts h[123] #=> hi
# change the default:
h.default = "ho"
在上面的情况下,散列保持为空。
h = Hash.new{|h,k| h[k] = []}
h[123] << "a"
p h # =>{123=>["a"]}
Hash.new([])
因为相同的数组(与相同的对象相同)将用于每个键,所以不会有效。
不要在这里击败死马,但setDefault的行为更像是对散列的fetch。它的行为与默认对散列的行为方式不同。在哈希上设置默认值后,任何缺少的键都将使用该默认值。 setDefault不是这种情况。它仅存储一个缺失密钥的值,并且仅在找不到该密钥时才存储。整个存储新的键值对是它与fetch的不同之处。
与此同时,我们目前正在做setDefault这样做:
h = {}
h['key'] ||= 'value'
Ruby继续开车回家:
h.default = "Hey now"
h.fetch('key', 'default') # => 'value'
h.fetch('key-doesnt-exist', 'default') # => 'default'
# h => {'key' => 'value'}
h['not your key'] # => 'Hey now'
蟒蛇:
h = {'key':'value'}
h.setdefault('key','default') # => 'value'
h.setdefault('key-doesnt-exist','default') # => 'default'
# h {'key': 'value', 'key-doesnt-exist': 'default'}
h['not your key'] # => KeyError: 'not your key'
Python中没有与此函数等效的东西。您始终可以使用猴子修补来获得此功能:
class Hash
def setdefault(key, value)
if self[key].nil?
self[key] = value
else
self[key]
end
end
end
h = Hash.new
h = { 'key' => 'value' }
h.setdefault('key', 'default')
# => 'value'
h.setdefault('key-doesnt-exist', 'default')
# => 'default'
但请记住,猴子修补通常被视为禁忌,至少在某些代码环境中。
猴子补丁的黄金法则适用:只因为你可以,
并不意味着你应该。
更惯用的方法是通过定义默认值 哈希构造函数 通过传递一个额外的块或值。
你可以简单 传递一个块到 Hash
构造函数:
hash = Hash.new do |hash, key|
hash[key] = :default
end
当尝试访问不存在的密钥时,将调用该块。它将传递哈希对象和密钥。你可以随心所欲地做任何事情;将密钥设置为默认值,从密钥中派生新值等。
如果你已经有了 Hash
对象,你可以使用 该 default_proc=
方法:
hash = { key: 'value' }
# ...
hash.default_proc = proc do |hash, key|
hash[key] = :default
end