博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Ruby 哈希操作(和 Python3 字典对比)
阅读量:4229 次
发布时间:2019-05-26

本文共 16661 字,大约阅读时间需要 55 分钟。

哈希内建方法

# Ruby[1] pry(main)> months = Hash.new=> {}[2] pry(main)> months = Hash.new("month")=> {}[3] pry(main)> months[0]=> "month"[4] pry(main)> months[3]=> "month"
# Python3>>> months = {}>>> type(months)
>>> months = dict()>>> months{}>>> dict_data.setdefault('key3', 'None')'None'

 hash == other_hash

# Ruby[6] pry(main)> hash_data = {"key1"=>"hello", "key2"=>"world"}=> {"key1"=>"hello", "key2"=>"world"}[7] pry(main)> hash_data2 = {"key1"=>"hello", "key2"=>"world"}=> {"key1"=>"hello", "key2"=>"world"}[8] pry(main)> hash_data == hash_data2=> true[9] pry(main)> hash_data2 = {"key"=>"hello", "key2"=>"world"}=> {"key"=>"hello", "key2"=>"world"}[10] pry(main)> hash_data == hash_data2=> false
# Python3>>> dict_data = {"key1":"hello", "key2":"world"}>>> dict_data2 = {"key":"hello", "key2":"world"}>>> dict_data == dict_data2False>>> dict_data2 = {"key1":"hello", "key2":"world"}>>> dict_data == dict_data2True

hash[key]

# Ruby[6] pry(main)> hash_data = {"key1"=>"hello", "key2"=>"world"}[11] pry(main)> hash_data["key1"]=> "hello"
# Python3>>> dict_data{'key1': 'hello', 'key2': 'world'}>>> dict_data["key1"]'hello'

hash[key]=value

# Ruby[6] pry(main)> hash_data = {"key1"=>"hello", "key2"=>"world"}=> {"key1"=>"hello", "key2"=>"world"}[12] pry(main)> hash_data["key1"] = "world"=> "world"[13] pry(main)> hash_data=> {"key1"=>"world", "key2"=>"world"}
# Python3>>> dict_data = {"key1":"hello", "key2":"world"}>>> dict_data["key1"] = "world">>> dict_data{'key1': 'world', 'key2': 'world'}

hash.clear

# Ruby[6] pry(main)> hash_data = {"key1"=>"hello", "key2"=>"world"}=> {"key1"=>"hello", "key2"=>"world"}[14] pry(main)> hash_data.clear=> {}[15] pry(main)> hash_data=> {}
# Python3>>> dict_data = {"key1":"hello", "key2":"world"}>>> dict_data.clear()>>> dict_data{}

hash.default = obj

# Ruby[6] pry(main)> hash_data = {"key1"=>"hello", "key2"=>"world"}=> {"key1"=>"hello", "key2"=>"world"}[23] pry(main)> hash_data["key3"]=> nil[24] pry(main)> hash_data.default = "hello world"=> "hello world"[25] pry(main)> hash_data["key3"]=> "hello world"
# Python3>>> dict_data = {"key1":"hello", "key2":"world"}>>> dict_data["key3"]Traceback (most recent call last):  File "
", line 1, in
KeyError: 'key3'>>> from collections import defaultdict>>> dict_data = defaultdict(str)>>> dict_data["key3"]''

hash.delete(key)  [or] hash.delete(key) { |key| block }

通过 key 从 hash 中删除键值对。如果使用了块且未找到匹配的键值对,则返回块的结果。

# Ruby[6] pry(main)> hash_data = {"key1"=>"hello", "key2"=>"world"}=> {"key1"=>"hello", "key2"=>"world"}[29] pry(main)> hash_data.delete "key1"=> "hello"[30] pry(main)> hash_data=> {"key2"=>"world"}[39] pry(main)> hash_data.delete("key3"){|key| puts "No key3 to delete"}No key3 to delete=> nil
# Python3>>> dict_data = {"key1":"hello", "key2":"world"}>>> del dict_data["key1"]>>> dict_data{'key2': 'world'}

hash.delete_if { |key,value| block }

block 为 true 的每个块,从 hash 中删除键值对。

# Ruby[6] pry(main)> hash_data = {"key1"=>"hello", "key2"=>"world"}=> {"key1"=>"hello", "key2"=>"world"}[41] pry(main)> hash_data.delete_if{|key, value| key=="key1"}=> {"key2"=>"world"}[42] pry(main)> hash_data=> {"key2"=>"world"}
# Python3>>> dict_data = {"key1":"hello", "key2":"world"}>>> [dict_data.pop(key) for (key, value) in dict_data.items() if key=='key1']Traceback (most recent call last):  File "
", line 1, in
File "
", line 1, in
RuntimeError: dictionary changed size during iteration>>> dict_data{'key2': 'world'}

hash.each { |key,value| block }

# Ruby[6] pry(main)> hash_data = {"key1"=>"hello", "key2"=>"world"}=> {"key1"=>"hello", "key2"=>"world"}[47] pry(main)> hash_data.each{|key, value| puts key + "=>" + value}key1=>hellokey2=>world=> {"key1"=>"hello", "key2"=>"world"}
# Python3>>> dict_data = {"key1":"hello", "key2":"world"}>>> [print(key + "=>" + value) for (key, value) in dict_data.items()]key1=>hellokey2=>world[None, None]>>> [print(key + "=>" + dict_data[key]) for key in dict_data.keys()]key1=>hellokey2=>world[None, None]

hash.each_with_index { |(key, value), index| block }

# Ruby[6] pry(main)> hash_data = {"key1"=>"hello", "key2"=>"world"}=> {"key1"=>"hello", "key2"=>"world"}[9] pry(main)> hash_data.each_with_index{|(key, value), index| puts index.to_s + key + "=>" + value}0key1=>hello1key2=>world=> {"key1"=>"hello", "key2"=>"world"}
# Python3>>> dict_data = {"key1":"hello", "key2":"world"}>>> [print(key + "=>" + value) for (key, value) in dict_data.items()]key1=>hellokey2=>world[None, None]>>> [print(key + "=>" + dict_data[key]) for key in dict_data.keys()]key1=>hellokey2=>world[None, None]

hash.each_key { |key| block }

# Ruby[6] pry(main)> hash_data = {"key1"=>"hello", "key2"=>"world"}=> {"key1"=>"hello", "key2"=>"world"}=> {"key1"=>"hello", "key2"=>"world"}[48] pry(main)> hash_data.each_key{|key| puts key}key1key2=> {"key1"=>"hello", "key2"=>"world"}[54] pry(main)> hash_data.each_key{|key| puts key + "=>" + hash_data[key]}key1=>hellokey2=>world=> {"key1"=>"hello", "key2"=>"world"}
# Python3>>> dict_data = {"key1":"hello", "key2":"world"}>>> [print(key) for key in dict_data.keys()]key1key2[None, None]

hash.each_value { |value| block }

# Ruby[6] pry(main)> hash_data = {"key1"=>"hello", "key2"=>"world"}=> {"key1"=>"hello", "key2"=>"world"}[55] pry(main)> hash_data.each_value{|value| puts value}helloworld=> {"key1"=>"hello", "key2"=>"world"}
# Python3>>> dict_data = {"key1":"hello", "key2":"world"}>>> [print(value) for value in dict_data.values()]helloworld[None, None]

hash.empty?

# Ruby[6] pry(main)> hash_data = {"key1"=>"hello", "key2"=>"world"}=> {"key1"=>"hello", "key2"=>"world"}[57] pry(main)> hash_data.empty?=> false[58] pry(main)> {}.empty?=> true
# Python3>>> dict_data = {"key1":"hello", "key2":"world"}>>> len(dict_data) == 0False>>> len({}) == 0True

hash.fetch(key) { | key | block }

# Ruby[6] pry(main)> hash_data = {"key1"=>"hello", "key2"=>"world"}=> {"key1"=>"hello", "key2"=>"world"}[59] pry(main)> hash_data.fetch("key1")=> "hello"[60] pry(main)> hash_data.fetch("key3")KeyError: key not found: "key3"from (pry):60:in "fetch"[65] pry(main)> hash_data.fetch("key1", "No key1 to fetch")=> "hello"[66] pry(main)> hash_data.fetch("key3", "No key3 to fetch")=> "No key3 to fetch"[67] pry(main)> hash_data.fetch("key3"){|key| puts "No key3 to fetch"}No key3 to fetch=> nil
# Python3>>> dict_data = {"key1":"hello", "key2":"world"}>>> dict_data["key1"]'hello'>>> dict_data["key3"]Traceback (most recent call last):  File "
", line 1, in
KeyError: 'key3'

hash.has_key?(key) [or] hash.key?(key)

# Ruby[6] pry(main)> hash_data = {"key1"=>"hello", "key2"=>"world"}=> {"key1"=>"hello", "key2"=>"world"}[69] pry(main)> hash_data.has_key?"key1"=> true[70] pry(main)> hash_data.has_key?"key3"=> false[71] pry(main)> hash_data.key?"key1"=> true[72] pry(main)> hash_data.key?"key3"=> false
# Python3>>> dict_data = {"key1":"hello", "key2":"world"}>>> "key1" in dict_dataTrue>>> "key3" in dict_dataFalse

hash.include?(key) [or] hash.member?(key) 

# Ruby[6] pry(main)> hash_data = {"key1"=>"hello", "key2"=>"world"}=> {"key1"=>"hello", "key2"=>"world"}[73] pry(main)> hash_data.include?"key1"=> true[74] pry(main)> hash_data.include?"key3"=> false[75] pry(main)> hash_data.member?"key1"=> true[76] pry(main)> hash_data.member?"key3"=> false
# Python3>>> dict_data = {"key1":"hello", "key2":"world"}>>> "key1" in dict_dataTrue>>> "key3" in dict_dataFalse

hash.has_value?(value) [or] hash.value?(value)

# Ruby[6] pry(main)> hash_data = {"key1"=>"hello", "key2"=>"world"}=> {"key1"=>"hello", "key2"=>"world"}[77] pry(main)> hash_data.has_value?"hello"=> true[78] pry(main)> hash_data.has_value?"olleh"=> false[159] pry(main)> hash_data.value?"hello"=> true
# Python3>>> dict_data = {"key1":"hello", "key2":"world"}>>> "hello" in dict_data.values()True>>> "olleh" in dict_data.values()False

hash.index(value)

# Ruby[6] pry(main)> hash_data = {"key1"=>"hello", "key2"=>"world"}=> {"key1"=>"hello", "key2"=>"world"}[81] pry(main)> hash_data.index("hello")(pry):81: warning: Hash#index is deprecated; use Hash#key=> "key1"[82] pry(main)> hash_data.index("value1")(pry):82: warning: Hash#index is deprecated; use Hash#key=> nil
# Python3>>> dict_data = {"key1":"hello", "key2":"world"}>>> [print(key) for (key, value) in dict_data.items() if value=="hello"]key1[None]

hash.invert

# Ruby[6] pry(main)> hash_data = {"key1"=>"hello", "key2"=>"world"}=> {"key1"=>"hello", "key2"=>"world"}[87] pry(main)> hash_data.invert=> {"hello"=>"key1", "world"=>"key2"}
# Python3>>> dict_data = {"key1":"hello", "key2":"world"}>>> dict([(value, key) for (key, value) in dict_data.items()]){'hello': 'key1', 'world': 'key2'}

hash.key?

# Ruby[4] pry(main)> hash_data = {"key1"=>"hello", "key2"=>"world"}=> {"key1"=>"hello", "key2"=>"world"}[7] pry(main)> hash_data.key? 'key1'=> true[8] pry(main)> hash_data.key? 'key3'=> false

hash.keys

# Ruby[6] pry(main)> hash_data = {"key1"=>"hello", "key2"=>"world"}=> {"key1"=>"hello", "key2"=>"world"}[88] pry(main)> hash_data.keys=> ["key1", "key2"]
# Python3>>> dict_data = {"key1":"hello", "key2":"world"}>>> dict_data.keys()dict_keys(['key1', 'key2'])

hash.value?

# Ruby[11] pry(main)> hash_data = {"key1"=>"hello", "key2"=>"world"}=> {"key1"=>"hello", "key2"=>"world"}[12] pry(main)> hash_data.value?'hello'=> true[13] pry(main)> hash_data.value?'hell'=> false

hash.values

# Ruby[6] pry(main)> hash_data = {"key1"=>"hello", "key2"=>"world"}=> {"key1"=>"hello", "key2"=>"world"}[89] pry(main)> hash_data.values=> ["hello", "world"]
# Python3>>> dict_data = {"key1":"hello", "key2":"world"}>>> dict_data.values()dict_values(['hello', 'world'])

 hash.length(hash.size)

# Ruby[6] pry(main)> hash_data = {"key1"=>"hello", "key2"=>"world"}=> {"key1"=>"hello", "key2"=>"world"}[90] pry(main)> hash_data.length=> 2[125] pry(main)> hash_data.size=> 2
# Python3>>> dict_data = {"key1":"hello", "key2":"world"}>>> len(dict_data)2

hash.merge(other_hash) [or] hash.merge!(other_hash)

包含 hash 和 other_hash 的内容,重写 hash 中与 other_hash 带有重复键的键值对。

# Ruby[6] pry(main)> hash_data = {"key1"=>"hello", "key2"=>"world"}=> {"key1"=>"hello", "key2"=>"world"}[93] pry(main)> hash_data2 = {"key2"=>"hello", "key3"=>"world"}=> {"key2"=>"hello", "key3"=>"world"}[95] pry(main)> hash_data.merge hash_data2=> {"key1"=>"hello", "key2"=>"hello", "key3"=>"world"}[96] pry(main)> hash_data=> {"key1"=>"hello", "key2"=>"world"}[108] pry(main)> hash_data.merge! hash_data2=> {"key1"=>"hello", "key2"=>"hello", "key3"=>"world"}[109] pry(main)> hash_data=> {"key1"=>"hello", "key2"=>"hello", "key3"=>"world"}
# Python3>>> dict_data = {"key1":"hello", "key2":"world"}>>> dict_data{'key1': 'hello', 'key2': 'world'}>>> dict_data2{'key2': 'hello', 'key3': 'world'}>>> dict_data.update(dict_data2)>>> dict_data{'key1': 'hello', 'key2': 'hello', 'key3': 'world'}

hash.merge(other_hash) { |key, oldval, newval| block }

包含 hash 和 other_hash 的内容,可选择重写 hash 中与 other_hash 带有重复键的键值对。

# Ruby[6] pry(main)> hash_data = {"key1"=>"hello", "key2"=>"world"}[103] pry(main)> hash_data=> {"key1"=>"hello", "key2"=>"world"}[104] pry(main)> hash_data2=> {"key2"=>"hello", "key3"=>"world"}# 相同 key 保留新的 value (覆盖)[102] pry(main)> hash_data.merge(hash_data2){|key, oldval, newval| newval}=> {"key1"=>"hello", "key2"=>"hello", "key3"=>"world"}# 相同 key 保留旧的 value (不覆盖)[105] pry(main)> hash_data.merge(hash_data2){|key, oldval, newval| oldval}=> {"key1"=>"hello", "key2"=>"world", "key3"=>"world"}
# Python3>>> dict_data = {"key1":"hello", "key2":"world"}>>> dict_data{'key1': 'hello', 'key2': 'world'}>>> dict_data2{'key2': 'hello', 'key3': 'world'}>>> dict_data.update(dict_data2)>>> dict_data{'key1': 'hello', 'key2': 'hello', 'key3': 'world'}

hash.rehash

# Ruby[6] pry(main)> hash_data = {"key1"=>"hello", "key2"=>"world"}=> {"key1"=>"hello", "key2"=>"world"}[110] pry(main)> hash_data.rehash=> {"key1"=>"hello", "key2"=>"hello", "key3"=>"world"}

hash.reject { |key, value| block } [or] hash.reject { |key, value| block }

# Ruby[6] pry(main)> hash_data = {"key1"=>"hello", "key2"=>"world"}=> {"key1"=>"hello", "key2"=>"world"}[115] pry(main)> hash_data.reject{|key, value| key=='key1'}=> {"key2"=>"world"}[116] pry(main)> hash_data=> {"key1"=>"hello", "key2"=>"world"}[117] pry(main)> hash_data.reject!{|key, value| key=='key1'}=> {"key2"=>"world"}[118] pry(main)> hash_data=> {"key2"=>"world"}
# Python3>>> dict_data = {"key1":"hello", "key2":"world"}>>> [dict_data.pop(key) for (key, value) in dict_data.items() if key=="key1"]Traceback (most recent call last):  File "
", line 1, in
File "
", line 1, in
RuntimeError: dictionary changed size during iteration>>> dict_data{'key2': 'world'}

hash.replace(other_hash)

# Ruby[6] pry(main)> hash_data = {"key1"=>"hello", "key2"=>"world"}=> {"key1"=>"hello", "key2"=>"world"}[121] pry(main)> hash_data2=> {"key2"=>"hello", "key3"=>"world"}[122] pry(main)> hash_data.replace(hash_data2)=> {"key2"=>"hello", "key3"=>"world"}[123] pry(main)> hash_data=> {"key2"=>"hello", "key3"=>"world"}
# Python3>>> dict_data = {"key1":"hello", "key2":"world"}>>> dict_data2{'key2': 'hello', 'key3': 'world'}>>> dict_data = dict_data2.copy()>>> dict_data{'key2': 'hello', 'key3': 'world'}

hash.select { |key, value| block } [or] hash.select! { |key, value| block }

# Ruby[6] pry(main)> hash_data = {"key1"=>"hello", "key2"=>"world"}=> {"key1"=>"hello", "key2"=>"world"}[127] pry(main)> hash_data.select{|key, value| key=="key1"}=> {"key1"=>"hello"}[128] pry(main)> hash_data=> {"key1"=>"hello", "key2"=>"world"}[129] pry(main)> hash_data.select!{|key, value| key=="key1"}=> {"key1"=>"hello"}[130] pry(main)> hash_data=> {"key1"=>"hello"}
# Python3>>> dict_data = {"key1":"hello", "key2":"world"}

hash.shift

# Ruby[6] pry(main)> hash_data = {"key1"=>"hello", "key2"=>"world"}=> {"key1"=>"hello", "key2"=>"world"}[133] pry(main)> hash_data.shift=> ["key1", "hello"][134] pry(main)> hash_data=> {"key2"=>"world"}
# Python3>>> dict_data = {"key1":"hello", "key2":"world"}>>> dict_data.pop("key1")'hello'>>> dict_data{'key2': 'world'}

hash.sort

# Ruby[6] pry(main)> hash_data = {"key1"=>"hello", "key2"=>"world"}=> {"key1"=>"hello", "key2"=>"world"}[138] pry(main)> hash_data.sort=> [["key1", "hello"], ["key2", "world"]]
# Python3>>> dict_data = {"key1":"hello", "key2":"world"}>>> sorted(list(dict_data.items()))[('key1', 'hello'), ('key2', 'world')]

hash.store(key, value)

# Ruby[6] pry(main)> hash_data = {"key1"=>"hello", "key2"=>"world"}=> {"key1"=>"hello", "key2"=>"world"}[144] pry(main)> hash_data.store('key3', 'hello3')=> "hello3"[145] pry(main)> hash_data=> {"key1"=>"hello", "key2"=>"world", "key3"=>"hello3"}
# Python3>>> dict_data = {"key1":"hello", "key2":"world"}>>> dict_data['key3'] = "hello3">>> dict_data{'key1': 'hello', 'key2': 'world', 'key3': 'hello3'}

hash.to_a

# Ruby[6] pry(main)> hash_data = {"key1"=>"hello", "key2"=>"world"}=> {"key1"=>"hello", "key2"=>"world"}[147] pry(main)> hash_data.to_a=> [["key1", "hello"], ["key2", "world"]]
# Python3>>> dict_data = {"key1":"hello", "key2":"world"}>>> list(dict_data.items())[('key1', 'hello'), ('key2', 'world')]

hash.to_s

# Ruby[6] pry(main)> hash_data = {"key1"=>"hello", "key2"=>"world"}=> {"key1"=>"hello", "key2"=>"world"}[149] pry(main)> hash_data.to_s=> "{\"key1\"=>\"hello\", \"key2\"=>\"world\"}"
# Python3>>> dict_data = {"key1":"hello", "key2":"world"}>>> str(dict_data)"{'key1': 'hello', 'key2': 'world'}"

hash.update(other_hash) 

# Ruby[6] pry(main)> hash_data = {"key1"=>"hello", "key2"=>"world"}=> {"key1"=>"hello", "key2"=>"world"}[152] pry(main)> hash_data.update(hash_data2)=> {"key1"=>"hello", "key2"=>"hello", "key3"=>"world"}[155] pry(main)> hash_data.update(hash_data2){|key, oldval, newval| oldval}=> {"key1"=>"hello", "key2"=>"world", "key3"=>"world"}
# Python3>>> dict_data = {"key1":"hello", "key2":"world"}>>> dict_data{'key1': 'hello', 'key2': 'world'}>>> dict_data2{'key2': 'hello', 'key3': 'world'}>>> dict_data.update(dict_data2)>>> dict_data{'key1': 'hello', 'key2': 'hello', 'key3': 'world'}

hash.values_at(obj)

# Ruby[6] pry(main)> hash_data = {"key1"=>"hello", "key2"=>"world"}=> {"key1"=>"hello", "key2"=>"world"}[160] pry(main)> hash_data.values_at('key1')=> ["hello"][161] pry(main)> hash_data.values_at('key1', 'key2')=> ["hello", "world"][162] pry(main)> hash_data.values_at('key1', 'key2', 'key3')=> ["hello", "world", nil]
# Python3>>> dict_data = {"key1":"hello", "key2":"world"}>>> [value for (key, value) in dict_data.items() if key in ['key1']]['hello']>>> [value for (key, value) in dict_data.items() if key in ['key1', 'key2']]['hello', 'world']>>> [value for (key, value) in dict_data.items() if key in ['key1', 'key2', 'key3']]['hello', 'world']

 

转载地址:http://vcjqi.baihongyu.com/

你可能感兴趣的文章
内存操作越界略述
查看>>
消息与消息队列
查看>>
关于#include "stdafx.h"
查看>>
VC下线程同步的三种方法(互斥、事件、临界区)/(转)
查看>>
非常好的一篇U-BOOT的文章--转载
查看>>
【设计模式】学习之创建型 单例模式
查看>>
【设计模式】学习之创建型 原型模式
查看>>
【设计模式】学习之结构型 适配器模式-装饰器模式-代理模式
查看>>
Maven+Eclipse+Tomcat+Spring MVC web 请求 404 问题总结及noHandlerFound
查看>>
SpringMVC API缓存 LastModified的实现总结
查看>>
406 Not Acceptable 415 Unsupported Media Type Spring MVC consumes与produces
查看>>
MyBatis 高级映射与懒加载
查看>>
HCIP-H12-222练习题
查看>>
点到点IPSec VPN的配置
查看>>
MySQL InnoDB何时更新表的索引统计信息
查看>>
MTU 设置错误导致防火墙或者路由器断网
查看>>
子网划分详解与子网划分实例
查看>>
游戏通讯技术:帧同步技术
查看>>
防火墙技术指标---并发连接数/吞吐量
查看>>
V100服务器和T4服务器的性能指标
查看>>