[Python] OrderedDict

[Python] OrderedDict,第1张

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等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9286263.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-26
下一篇2023-04-26

发表评论

登录后才能评论

评论列表(0条)

    保存