什么样的类型可以作为python字典的key

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么样的类型可以作为python字典的key相关的知识,希望对你有一定的参考价值。

参考技术A 可变类型包括dict,list都不可以作为字典的key,而原子类型以及tuple则可以。追答

key:一是不能重复出现;二是键不可变。

Python数据结构 字典

0x 01 字典简介

    子典和列表是python中最常用的两种数据类型,字典是键值对(key-value)格式的数据类型,它和列表一样也有索引,但不是列表中的下标,而是使用key来作为索引,key所对应的值就是value,所以字典是无序的,因此任何时候只要访问字典的key,便可以得到对应的value,。key必须是不可变类型且唯一(和set一样天生去重),比如字符串、数字、元祖等。


0x 02 字典和其它常见数据类型的区别

数据类型    符号表示   是否可变类型(一旦赋值是否可修改)

列表               []         可变类型

元祖               ()         不可变类型

集合               {}         可变类型

字典               {}         可变类型     


下面介绍一些字典常见的操作:


0x 03 字典的创建、添加

最简单创建字典并添加元素的方式:

dic = {}       
dic[‘key1‘] = 1
dic[‘key2‘] = 2
dic[‘key3‘] = 3


直接打印字典名看下最终dic字典的数据有哪些:

print(dic)
{‘key2‘: 2, ‘key1‘: 1, ‘key3‘: 3}


上面我们创建了一个名为dic的空字典,并分别为字典添加了三个key:key1,key2,key3,每个key都有对应的value,最终查看的结果中再次证明字典存储是无序的(没有先后顺序的)。


0x 04 字典的删除

dic.popitem()    #调用字典的popitem()方法,随机删除一个元素
{‘key2‘: 2, ‘key3‘: 3}

dic.pop(‘key2‘)     #调用pop()方法,删除指定的key
{‘key1‘: 1, ‘key3‘: 3}

del dic[‘key3‘]      #指定删除字典中的索引(即key)及其值(value)
{‘key1‘: 1, ‘key2‘: 2}


0x 05 字典的修改

dic[‘key2‘] = 4      #重新赋值即定义
{‘key1‘: 1, ‘key2‘: 4, ‘key3‘: 3}


0x 06 字典的查找

print(dic[‘key2‘])       #直接使用key来寻找对应的值
2
print(dic[‘key4‘])       #key方式直接读取,如果没有找到key对应的值,就会抛出KeyError异常
KeyError: ‘key4‘


print(dic.get(‘key3‘))   #使用get()方法,如果值存在就返回
3
print(dic.get(‘key4‘))    #get()方法如果发现值不存在,则会返回一个None对象,更加友好的输出
None

print(dic.setdefault(‘key3‘,‘33‘))   #setdefault()方法,如果指定的key已存在,则返回当前的值
3
print(dic.setdefault(‘key4‘,‘44‘))  #如当前key不存在,则设置一个默认值添加到字典并返回value的值
44
print(dic)                      #最终的字典
{‘key3‘: 3, ‘key2‘: 2, ‘key1‘: 1, ‘key4‘: ‘44‘}


再看一下字典的keys()、values()、items()方法的区别:

[print(i) for i in dic.keys()]   #可以看到keys()存储的是字典的key(键的名字)
key1
key3
key2

[print(i) for i in dic.values()]  #values()存储的是所有的values(值)
1
3
2

[print(k,v) for k,v in dic.items()]  #而items()则是存储了key及key对应的values()
key1 1
key3 3
key2 2


0x 07 字典的使用(一)

"""
使用字典来实现:用户输入一个数字,打印每一位数字及其重复的次数
"""

# 判断用户输入是否是数字
print(‘[note] please input a integer.‘)
while True:
    num = input(‘>>> ‘).strip().lstrip(‘0‘)
    if num.isdigit():
        break
    else:
        print(‘[Error] You input is not a number, please re-input.‘)

#空字典
nums = {}

#value值递增
for i in num:
    if not nums.get(i):  #返回key对应的值value
        nums.setdefault(i, 1)
    else:
        print(nums.get(i))
        nums[i] += 1

#迭代输出
for k, v in nums.items():  #keys()   values()    items()
    print(k, v)


0x 08 字典的使用(二)

"""
数字重复统计
    随机产生100个整数
    数字的范围[-1000,1000]
    升序输出所有不同的数字及其重复的次数
"""

import random

nums = {}

for _ in range(100):
    randnums = random.randrange(-1000, 1000)
    if nums.get(randnums):
        nums[randnums] += 1
        continue
    else:
        nums.setdefault(randnums, 1)

keys = sorted(nums.keys())

for i in keys:
    print(‘{:<4} {:<4}‘.format(i, nums[i]))




0x 09 字典的使用(三)

"""
字符串重复统计
    字符表‘abcdefghijklmnopqrstuvwxyz‘
    随机挑选2个字母组成字符串,共挑选100个
    降序输出这100个字符串及重复的次数
"""

import random
import string

strs = ‘abcdefghijklmnopqrstuvwxyz‘
dic = {}

for _ in range(100):
    # randstr = ‘‘.join(random.sample(strs, 2))
    randstr = "".join(random.choice(strs) for _ in range(0, 2))   #三种输出2个随机字符的方式
    # randstr = ‘‘.join(random.sample(string.ascii_lowercase, 2))
    if randstr not in dic:
        dic.setdefault(randstr, 1)
    else:
        dic[randstr] += 1

sortstr = sorted(dic.keys())   #升序
#sortstr = sorted(dic.keys(),reverse=True)  #降序

for i in sortstr:
    print(‘{:<4} {:<4}‘.format(i, dic[i]))




"""
Data    #string模块的一些常用字符串对象
          __all__ = [‘ascii_letters‘, ‘ascii_lowercase‘, ‘ascii_uppercase‘, ‘capwords‘, ‘digits‘, ‘hexdigits‘, ‘octdigits‘, ‘printable‘, ‘punctuation‘, ‘whitespace‘, ‘Formatter‘, ‘Template‘]
ascii_letters = ‘abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ‘
ascii_lowercase = ‘abcdefghijklmnopqrstuvwxyz‘
ascii_uppercase = ‘ABCDEFGHIJKLMNOPQRSTUVWXYZ‘
digits = ‘0123456789‘
hexdigits = ‘0123456789abcdefABCDEF‘
octdigits = ‘01234567‘
printable = ‘0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\‘()*+,-./:;<=>[email protected][\\]^_`{|}~ \t\n\r\x0b\x0c‘
punctuation = ‘!"#$%&\‘()*+,-./:;<=>[email protected][\\]^_`{|}~‘
whitespace = ‘ \t\n\r\x0b\x0c‘
"""





以上是关于什么样的类型可以作为python字典的key的主要内容,如果未能解决你的问题,请参考以下文章

python的元组能作为字典的key吗?为什么?

python的元组能作为字典的key吗?为什么?

Python面试必考重点之列表,元组和字典第十三关——有哪些数据类型不能作为字典键值的类型/为什么列表和字典类型的值不能作为字典的键值

字典中的数据类型为unicode

Python中字典的key都可以是什么

python中字典的使用方法怎么样的?