【Python】Python字典fromkeys,dict_keys转化list方法以及有序字典的进一步了解


今天看到一个列表去重的方法:

def clear_repeat(repeat_list):
    new_dict = {}
    return new_dict.fromkeys(repeat_list).keys()

after_deal = clear_repeat([1,2,3,4,3,2,1,5,6,5])
print(type(after_deal))
print(after_deal)

输出结果:

<class 'dict_keys'>
dict_keys([1, 2, 3, 4, 5, 6])

dict_keys转化为list

和转化为set后一样,使用list进行转化就可以了.

def clear_repeat(repeat_list):
    new_dict = {}
    return new_dict.fromkeys(repeat_list).keys()

after_deal = clear_repeat([1,2,3,7,4,3,2,1,5,6,5])
print(type(after_deal))
print(after_deal)
print(list(after_deal))

输出结果:

<class 'dict_keys'>
dict_keys([1, 2, 3, 4, 5, 6, 7])
[1, 2, 3, 4, 5, 6, 7]

这样确实可以做到list去重,但是会改变原来顺序

dict.fromkeys()

help(dict.fromkeys)

Python提供的help信息:

Help on built-in function fromkeys:

fromkeys(iterable, value=None, /) method of builtins.type instance
    Returns a new dict with keys from iterable and values equal to value.

下面代码实例:

a_list =[1,2,3]
a_dict={}
b_dict=a_dict.fromkeys(a_list)
print(b_dict)   # {1: None, 2: None, 3: None}
c_dict=a_dict.fromkeys(a_list,1)
print(c_dict)   # {1: 1, 2: 1, 3: 1}

也就是默认值为None,可以为键添加相同的值.
感觉可以用来初始化字典将所有键均赋同一个值.

有序字典

普通字典

b_dict = {}
b_dict[1]='a'
b_dict[3]='c'
b_dict[2]='b'

c_dict = {}
c_dict[1]='a'
c_dict[2]='b'
c_dict[3]='c'

print(id(b_dict))	# 25186096
print(id(c_dict))	# 25186144
print(b_dict == c_dict)		# True

普通字典并不受到顺序不同的影响,顺序不同但键值相同的字典视为相同字典

有序字典

b_dict = {}
b_dict[1]='a'
b_dict[3]='c'
b_dict[2]='b'

c_dict = {}
c_dict[1]='a'
c_dict[2]='b'
c_dict[3]='c'

print(b_dict == c_dict)
from collections import OrderedDict
d_dict = OrderedDict()
d_dict[1]='a'
d_dict[2]='b'
d_dict[3]='c'
for keys,values in d_dict.items():
    print(keys,values)

e_dict = OrderedDict()
e_dict[1]='a'
e_dict[3]='c'
e_dict[2]='b'

print(d_dict)
print(e_dict)
print(d_dict == e_dict)

输出结果:

1 a
2 b
3 c
OrderedDict([(1, 'a'), (2, 'b'), (3, 'c')])
OrderedDict([(1, 'a'), (3, 'c'), (2, 'b')])
False

最后的False表明,虽然键值对完全相同但是顺序不同的有序字典并不相同.
而且输出的和普通字典也不同,前面会有一个OrderDict.
可以用在对于字典顺序有要求的场景.
先学习下.

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值