![[Python] OrderedDict,第1张 [Python] OrderedDict,第1张](/aiimages/%5BPython%5D+OrderedDict.png)
OrderedDict类包含在collections模块中。
创建有序字典
clear: 清空有序字典
copy: 复制有序字典
fromkeys: 列表转换
items: 返回“键值对”列表
keys: 获取所有key
move_to_end: 指定一个key,把对应的key-value移到最后
pop: 获取指定key的value,并在字典中删除
popitem: 按照后进先出原则,删除最后加入的元素,返回key-value
setdefault: 获取指定key的value,如果key不存在,则创建
values: 获取字典所有的value,返回一个列表
普通字典不考虑存储顺序,有序字典的顺序与加入键值的顺序有关。
但是调用keys方法时,返回值不考虑顺序。
字典的key值是不可以重复的,如果重复默认取最后一个value值。
如果做 print dict_data 结果是:{'b':'2', 'a':'ddd'}。
key不能重复,但是字典的value值可以是任意类型。
所以可以给‘a’对应的value存成list
dict_data = {'a':['1','3','ddd'], 'b':'2'}
很简单,这样的就行:string value=aa["1"];
就可以了,另外告诉你dictionary的时间效率是1,是一个很效率很高的数据结构。
既然时间效率是1,那么我们寻址的时候就是直接寻址,也不需要去遍历dictionary,这就是为什么键必须唯一,不能重复的原因,如果重复了就不可能再是直接寻址的方式了。
c#dictionary通过key获取value的语法结构是:
private Dictionary<int,String> objectInfoDict_Drug=new ;
Dictionary<int,ObjectInfo_Drug>();
objectInfoDict_DrugAdd(1,"向字典添加一条数据");//第一个参数1就为这条记录的key;
string info;//定义一个字符串,用来存储通过字典获取到的值;
objectInfoDict_DrugTryGetValue(1,out info);//这时候就通过key,也就是数字1,找到了相应的数据存到了info里面。
Dictionary 对象用于在结对的名称/值中存储信息((等同于键和项目)。Dictionary 对象看似比数组更为简单,然而,Dictionary 对象却是更令人满意的处理关联数据的解决方案。
比较 Dictionary 和数组: 键用于识别 Dictionary 对象中的项目 无需调用 ReDim 来改变 Dictionary 对象的尺寸 当从 Dictionary 删除一个项目时,其余的项目会自动上移 Dictionary 不是多维,而数组是 Dictionary 与数组相比,有更多的内建对象 Dictionary 在频繁地访问随机元素时,比数组工作得更好 Dictionary 在根据它们的内容定位项目时,比数组工作得更好 下面的例子创建了一个 Dictionary 对象,并向对象添加了一些键/项目对,然后取回了键bl的值。
var dic = new Dictionary<string, int>() { {"a",1}, {"b",2}, {"c",3}, {"d",1} }; foreach (var item in dic) { if (itemValue == 1) { ConsoleWriteLine(itemKey); } }
1最直白的循环遍历方法,可以分为遍历key--value键值对以及所有的key两种表现形式
2用Linq的方式去查询(当然了这里要添加对应的命名空间 using SystemLinq)
如下为一个十分简单的代码示例:
private void GetDicKeyByValue()
{
Dictionary<string, string> dic = new Dictionary<string, string>();
dicAdd("1", "1");
dicAdd("2", "2");
dicAdd("3", "2");
//foreach KeyValuePair traversing
foreach (KeyValuePair<string, string> kvp in dic)
{
if (kvpValueEquals("2"))
{
// kvpKey;
}
}
//foreach dicKeys
foreach (string key in dicKeys)
{
if (dic[key]Equals("2"))
{
// key
}
}
//Linq
var keys = dicWhere(q => qValue == "2")Select(q => qKey); //get all keys
List<string> keyList = (from q in dic
where qValue == "2"
select qKey)ToList<string>(); //get all keys
var firstKey = dicFirstOrDefault(q => qValue == "2")Key; //get first key
}
VB codeDim dic As New Dictionary(Of String, String)
dicAdd("111", "")
dicAdd("32", "")
For Each k In dicKeys
Next
把这两个key值放到textbox1中去,key之间用vbcrlf分开
并不是无序,是undefined。也就是说可能有序可能无序(不要对顺序做任何假设)。至于为什么数字表现得有序而字符串不是,因为数字在Python中的哈希值是特殊的。
多说点吧。Python的字典实现其实就是个哈希表(当然里面有一些优化),每次赋值其实就是计算key的哈希值然后放到哈希表的指定位置中。遍历的话就是从前向后遍历整个哈希表。这里不讲处理冲突,就说最简单的往一个空字典中插入两个值。
先看字符串的情况:
>>> hash('1') & 7
0
>>> hash('2') & 7
3
>>> hash('3') & 7
2
>>> {'1': 1, '2': 2}
{'1': 1, '2': 2}
>>> {'2': 2, '3': 3}
{'3': 3, '2': 2}
可以看到因为同样对于字符串,第一个就是有序的,第二个就是无序的。为什么是
hash(object) & 7
Python里就这么设计的嘛。要注意的是,Python中哈希值的生成是可以被影响的,所以上面字符串的哈希值可能会在不同的Python进程中发生变化,导致它们出现在字典中顺序的不同。
那对于数字,Python中数字的哈希值是特殊的:
>>> hash(1)
1
>>> hash(2)
2
>>> hash(3)
3
所以你会看到它们在字典中是有序的。
再次强调的一点是,不要对字典中key的顺序做任何的假设,它们可能因为哈希值的变化,CPython实现的变化而随时发生改变。如果需要一个保持key的顺序的字典类型,请用collectionsOrderedDict,即使是在36中。
顺序变化的例子,35:
>>> {2: 2, 1: 1}
{1: 1, 2: 2}
36:
>>> {2: 2, 1: 1}
{2: 2, 1: 1}
以上就是关于[Python] OrderedDict全部的内容,包括:[Python] OrderedDict、python 如何循环读取字典中的keys所对应的values、C# 如何通过Key键获取Dictionary集合内的Value等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)