字典是另一种可变容器模型,且可存储任意类型对象。

字典的每个键值 key=>value 对用冒号 : 分割,每个键值对之间用逗号 , 分割,整个字典包括在花括号 {} 中 ,格式如下所示:

dic = {'太白':{'name': '太白','age': 25, 'sex': '',},
        'name_list': ['王双','韩蕾','何青松',],
        }

    key:value形式存储,

key:不可变(可哈希)的数据类型
value:任意数据类型,对象。
大量的数据,关系型数据。查询速度非常快
python3.5包含3.5之前,字典无序的。
python3.6以后,字典是有序的。
dic = {'name': '太白', 'age': 18, 'sex': '', 'job': 'IT'}

第一种: 有此key就改,无此key就添加
dic['sex'] = ''
dic['name'] = 'alex'

 

setdefault 有此key则不做任何操作但是给我返回对应的值,无此key则添加.
dic.setdefault('sex')
dic.setdefault('hobby','讲课')
dic.setdefault('name','alex')
print(dic.setdefault('name'))
print(dic)

 

fromkeys()

dic1 = dict.fromkeys([1,2,3],'alex')
print(dic1) #{1: 'alex', 2: 'alex', 3: 'alex'}

# 面试题:创建字典的方式
#1,
# dic = {'name':'alex'}
#2
# dic = dict({'name':'alex'})
# print(dic)
#3, fromkeys()

# 陷阱:
# dic1 = dict.fromkeys([1,2,3],[])
# print(dic1)
# # dic1[1].append('alex')
# print(dic1)
# print(id(dic1[1]))
# print(id(dic1[2]))
# print(id(dic1[3]))
总结:通过fromkeys()的默认值如果是一个[]空列表的话,这个列表是共用的,对列表进行操作,会影响到其他键值对。。。
#
dic = {'key1': 'value1','key2': 'value2', 'k3':'v3', 'name': 'alex'}
# 将 dic的键中含有k元素的所有键值对删除。
# for key in dic:
#     if 'k' in key:
#         dic.pop(key)
# dictionary changed size during iteration: 在循环一个字典时,不能改变字典的大小。
# l1 = []
# for key in dic:
#     if 'k' in key:
#         l1.append(key)
# # print(l1)
# for key in l1:
#     dic.pop(key)
# print(dic)

 

 得知遍历时不能修改字典元素,解决办法:将遍历条件改为列表

for i in list(dic):
    #print(i)
    if 'k' in i:
        print(i)
        del dic[i]
print(dic)

 

 
# pop 通过键去删除键值对,也有返回值,如果没有此键,并且设置了第二个参数,则不会报错,并且返回第二个参数。
print(dic.pop('name'))
print(dic.pop('name1',None))
print(dic.pop('name1','没有此键....'))
print(dic)

 

# clear 清空
dic.clear()
print(dic)

 


# popitem :3.5 之前随即删除某个键值对,3.6以后,删除最后一组键值对。有返回值.
print(dic.popitem())
print(dic)

 

# del
# 按照键删除键值对
del dic['name']

 

# 删除整个字典
del dic
print(dic)

 


# 第一种:
dic['age'] = 25
print(dic)

 

# 两个字典 update
dic = {"name":"jin","age":18,"sex":"male"}
dic2 = {"name":"alex","weight":75}
dic.update(dic2)  # 将dic2中的所有键值对覆盖并添加到dic中,dic2 不变。
print(dic)
print(dic2)

dic.update(a='666',b='222',name='taibai')  #也可以是键值对
print(dic)

 


# print(dic['name'])
# print(dic['name1'])  #按键查,没有的话会报错

# print(dic.get('name'))  #以后建议都用get查, 没有键,也不会报错。
# print(dic.get('name1'))
# print(dic.get('name1','没有此键。。。。'))

 

dic.keys(),以列表返回一个字典所有的键
print(dic.keys(),type(dic.keys()))  # 类似于列表的容器中

 

tinydict = {'Name': 'Zara', 'Age': 7}
print "Value : %s" %  tinydict.keys()
#Value : ['Age', 'Name']

 

可以转化成list

l1 = list(dic.keys())  # 可以转化成list
print(l1)

 

可以遍历
for key in dic.keys():  # 可以遍历
    print(key)

 

dic.values(),以列表返回字典中的所有值  可转化成list,可遍历。
print(dic.values())
print(list(dic.values()))
dic.items()  可转化成list,可遍历。
print(dic.items())

 

tinydict = {'Name': 'Runoob', 'Age': 7}

print "Value : %s" %  tinydict.values()

#Value : [7, 'Runoob']

 

 dic.items(),以列表返回可遍历的(键, 值) 元组数组

tinydict = {'Google': 'www.google.com', 'Runoob': 'www.runoob.com', 'taobao': 'www.taobao.com'}

print("字典值 : %s" % tinydict.items())

# 遍历字典列表
for key, values in tinydict.items():
    print(key, values)


字典值 : dict_items([('Google', 'www.google.com'), ('Runoob', 'www.runoob.com'), ('taobao', 'www.taobao.com')])
Google www.google.com
Runoob www.runoob.com
taobao www.taobao.com
View Code

 

分别赋值
a,b = 10,20
print(a,b)
a,b = [10,20]
print(a,b)
a,b = [(1,2),(3,4)]
print(a,b)
a = 10
b = 20
a,b = b,a
print(a,b)
for i in dic.items():
    '''
    i = ('name', '太白')
    i = ('age', 18)
    ....
    '''
    print(i)

 

for k,v in dic.items():
    '''
    k,v = ('name', '太白')
    k,v = ('age', 18)
    ....
    '''
    print(k,v)

for i in dic:
    print(i)
dict
print(len(dic))

 

字典的嵌套
dic = {'name_list': ['王双', 'alex', '孙飞', 'taibai'],
       1: {'name': 'taibai', 'age': 18, 'sex': ''},
       (1, 2): [100, {'ip': '192.168.1.1', 'port': 3306}]
       }

 

1,给 name_list对应的列表追加一个值: 司徒大人.
print(dic['name_list'])
dic['name_list'].append('司徒大人')
print(dic)

 

 2,将name_list对应的alex 变成全部大写.
dic['name_list'][1] = 'ALEX'
dic['name_list'][1] = dic['name_list'][1].upper()
print(dic)

 

3, 将1对应的字典添加一个键值对: weight : 75
print(dic[1])
dic[1]['weight'] = 75
print(dic)

 

4,将1 对应的字典的name键对应的名字taibai 换成alex
dic[1]['name'] = 'alex'
print(dic)

 

5,将 {'ip': '192.168.1.1', 'port': 3306} 此字典的port键值对删除.
dic[(1,2)][1].pop('port')
print(dic)

 


#作业及默写
#
# 1,有如下变量(tu是个元祖),请实现要求的功能
#
#tu = ("alex", [11, 22, {"k1": 'v1', "k2": ["age", "name"], "k3": (11, 22, 33)}, 44])
# a.讲述元祖的特性



# b.请问tu变量中的第一个元素 "alex" 是否可被修改?


# c.请问tu变量中的 "k2" 对应的值是什么类型?是否可以被修改?如果可以,请在其中添加一个元素 "Seven"


# d.请问tu变量中的 "k3" 对应的值是什么类型?是否可以被修改?如果可以,请在其中添加一个元素"Seven"


# 2, 字典dic, dic = {'k1': "v1", "k2": "v2", "k3": [11, 22, 33]}
#
dic = {'k1': "v1", "k2": "v2", "k3": [11, 22, 33]}
# a.请循环输出所有的key

# b.请循环输出所有的value

# c.请循环输出所有的key和value

# d.请在字典中添加一个键值对,"k4": "v4",输出添加后的字典


# e.请在修改字典中 "k1" 对应的值为 "alex",输出修改后的字典


# f.请在k3对应的值中追加一个元素44,输出修改后的字典


# g.请在k3对应的值的第 1 个位置插入个元素18,输出修改后的字典


# 3,

av_catalog = {
    "欧美": {
        "www.111.com": ["很多免费的,世界最大的", "质量一般"],
        "www.2222.com": ["很多免费的,也很大", "质量比22222高点"],
        "333.com": ["多是自拍,高质量图片很多", "资源不多,更新慢"],
        "444.com": ["质量很高,真的很高", "全部收费,屌丝请绕过"]
    },
    "日韩": {
        "tokyo-hot": ["质量怎样不清楚,个人已经不喜欢日韩范了", "verygood"]
    },
    "大陆": {
        "1024": ["全部免费,真好,好人一生平安", "服务器在国外,慢"]
    }
}
#
# a, 给此["很多免费的,世界最大的", "质量一般"]列表第二个位置插入一个元素:'量很大'。


# b, 将此["质量很高,真的很高", "全部收费,屌丝请绕过"] 列表的 "全部收费,屌丝请绕过" 删除。


# c, 将此["质量很高,真的很高", "全部收费,屌丝请绕过"] 列表的"全部收费,屌丝请绕过"删除。
# d, 将此["质量怎样不清楚,个人已经不喜欢日韩范了", "verygood"]列表的"verygood" 全部变成大写。


# e, 给'大陆'对应的字典添加一个键值对 '1048': ['一天就封了']


# f, 删除此 "333.com": ["多是自拍,高质量图片很多", "资源不多,更新慢"]键值对。


# g, 给此["全部免费,真好,好人一生平安", "服务器在国外,慢"]列表的第一个元素,加上一句话:'可以爬下来'

# 4、有字符串"k:1|k1:2|k2:3|k3:4" 处理成字典 {'k': 1, 'k1': 2....}





# 5、元素分类有如下值li = [11, 22, 33, 44, 55, 66, 77, 88, 99, 90],将所有大于 66的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中。
# 即: {'k1': 大于66的所有值列表, 'k2': 小于66的所有值列表}



# 6、输出商品列表,用户输入序号,显示用户选中的商品
#
# 商品列表:
goods = [{"name": "电脑", "price": 1999},
         {"name": "鼠标", "price": 10},
         {"name": "游艇", "price": 20},
         {"name": "美女", "price": 998}, ]
#
# 要求:
# 1:页面显示
# 序号 + 商品名称 + 商品价格,如:
# 1 电脑 1999   {'name': '电脑', 'price': 1999}
# 2 鼠标 10


# 2:用户输入选择的商品序号,然后打印商品名称及商品价格
# 3:如果用户输入的商品序号有误,则提示输入有误,并重新输入。
# 排除非字母的情况:isdigit()
# 超出数字范围
# while

# 4:用户输入Q或者q,退出程序。 break

#
#
# 明日默写内容。
#
# 1)字典的增删改查。
# 2)过滤敏感字符代码的默写。
#
# li = ["苍老师", "东京热", "武藤兰", "波多野结衣"]
# l1 = []
# comment = input('请输入评论>>>')
# for i in li:
#     comment = comment.replace(i, '*' * len(i))
# l1.append(comment)
# print(l1)
#
作业

 
#作业及默写
#
# 1,有如下变量(tu是个元祖),请实现要求的功能
#
#tu = ("alex", [11, 22, {"k1": 'v1', "k2": ["age", "name"], "k3": (11, 22, 33)}, 44])
# a.讲述元祖的特性
# 列表属于可边序列,可以任意修改列表中的元素,元组属于不可变序列,不能修改元组中的
# 元素,因此,元组没有增加元素,修改元素,删除元素相关的方法
# 因此,我们只需要学习元组的创建和删除,元组中元素的访问和技术即可,元组支持以下操作
# 1.索引访问 2.切片操作 3.连接操作 4.成员关系操作 5.比较运算操作
# 6.计数:元组长度len(),最大值max(),最小值(),求和sum()


# b.请问tu变量中的第一个元素 "alex" 是否可被修改?
#不可以

# c.请问tu变量中的 "k2" 对应的值是什么类型?是否可以被修改?如果可以,请在其中添加一个元素 "Seven"
# tu[1][2]['k2'].append('Seven')
# print(tu)

# d.请问tu变量中的 "k3" 对应的值是什么类型?是否可以被修改?如果可以,请在其中添加一个元素"Seven"
#元祖,不可以。


# 2, 字典dic, dic = {'k1': "v1", "k2": "v2", "k3": [11, 22, 33]}
#
dic = {'k1': "v1", "k2": "v2", "k3": [11, 22, 33]}
# a.请循环输出所有的key
# for key in dic.keys():
#     print(key)

# b.请循环输出所有的value
# for v in dic.values():
#     print(v)

# c.请循环输出所有的key和value
# for k,v in dic.items():
#     print(k,v)

# d.请在字典中添加一个键值对,"k4": "v4",输出添加后的字典
# dic['k4']= 'v4'
# print(dic)

# e.请在修改字典中 "k1" 对应的值为 "alex",输出修改后的字典
# dic['k1'] = 'alex'
# print(dic)

# f.请在k3对应的值中追加一个元素44,输出修改后的字典
# dic['k3'].append(44)
# print(dic)

# g.请在k3对应的值的第 1 个位置插入个元素18,输出修改后的字典
# dic['k3'].insert(0,18)
# print(dic)

# 3,

av_catalog = {
    "欧美": {
        "www.111.com": ["很多免费的,世界最大的", "质量一般"],
        "www.2222.com": ["很多免费的,也很大", "质量比22222高点"],
        "333.com": ["多是自拍,高质量图片很多", "资源不多,更新慢"],
        "444.com": ["质量很高,真的很高", "全部收费,屌丝请绕过"]
    },
    "日韩": {
        "tokyo-hot": ["质量怎样不清楚,个人已经不喜欢日韩范了", "verygood"]
    },
    "大陆": {
        "1024": ["全部免费,真好,好人一生平安", "服务器在国外,慢"]
    }
}
#
# a, 给此["很多免费的,世界最大的", "质量一般"]列表第二个位置插入一个元素:'量很大'。
# av_catalog['欧美']["www.111.com"].insert(1,'量很大')
# print(av_catalog)

# b, 将此["质量很高,真的很高", "全部收费,屌丝请绕过"] 列表的 "全部收费,屌丝请绕过" 删除。
# av_catalog['欧美']["444.com"].pop(1)
# print(av_catalog)

# c, 将此["质量很高,真的很高", "全部收费,屌丝请绕过"] 列表的"全部收费,屌丝请绕过"删除。
# d, 将此["质量怎样不清楚,个人已经不喜欢日韩范了", "verygood"]列表的"verygood" 全部变成大写。
# av_catalog['日韩']['tokyo-hot'][1] = av_catalog['日韩']['tokyo-hot'][1].upper()
#print(av_catalog)

# e, 给'大陆'对应的字典添加一个键值对 '1048': ['一天就封了']
# av_catalog['大陆']['1048'] = ['一天就封了']
# print(av_catalog)

# f, 删除此 "333.com": ["多是自拍,高质量图片很多", "资源不多,更新慢"]键值对。
# av_catalog['欧美'].pop("333.com")
# print(av_catalog)

# g, 给此["全部免费,真好,好人一生平安", "服务器在国外,慢"]列表的第一个元素,加上一句话:'可以爬下来'
# av_catalog['大陆']['1024'][0] = "全部免费,真好,好人一生平安,可以爬下来"
# av_catalog['大陆']['1024'][0] = av_catalog['大陆']['1024'][0] + '可以爬下来'
# av_catalog['大陆']['1024'][0] += '可以爬下来'
'''
count = count + 1     count += 1
'''
# 4、有字符串"k:1|k1:2|k2:3|k3:4" 处理成字典 {'k': 1, 'k1': 2....}
#s1 = "k:1|k1:2|k2:3|k3:4"
# s2 = s1.split('|')
# print(s2)  #['k:1', 'k1:2', 'k2:3', 'k3:4']
# for i in s2:
#     a,b =i.split(':')
#     dic[a]=int(b)
# print(dic)

# s2 = s1.split('|')
# for i in s2:
#     lst = i.split(':')
#     dic[lst[0]] =int(lst[1])
# print(dic)



# 5、元素分类有如下值li = [11, 22, 33, 44, 55, 66, 77, 88, 99, 90],将所有大于 66的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中。
# 即: {'k1': 大于66的所有值列表, 'k2': 小于66的所有值列表}
# li = [11, 22, 33, 44, 55, 66, 77, 88, 99, 90]
# dic = {'k1':[],'k2':[]}
# for i in li:
#     if i > 66:
#         dic['k1'].append(i)
#     else:
#         dic['k2'].append(i)
# print(dic)


# 6、输出商品列表,用户输入序号,显示用户选中的商品
#
# 商品列表:
goods = [{"name": "电脑", "price": 1999},
         {"name": "鼠标", "price": 10},
         {"name": "游艇", "price": 20},
         {"name": "美女", "price": 998}, ]
#
# 要求:
# 1:页面显示
# 序号 + 商品名称 + 商品价格,如:
# 1 电脑 1999   {'name': '电脑', 'price': 1999}
# 2 鼠标 10
dic = {}
for i in goods:
    #print(goods.index(i)+1,i['name'],i['price'])
    dic[goods.index(i)+1] = [i['name'],i['price']]
#print(dic)

# 2:用户输入选择的商品序号,然后打印商品名称及商品价格
# 3:如果用户输入的商品序号有误,则提示输入有误,并重新输入。
# 排除非字母的情况:isdigit()
# 超出数字范围
# while

# 4:用户输入Q或者q,退出程序。 break
# for input print()
#print(len(dic))
while 1:
    msg = input('请输入商品序号').strip()
    if msg.upper() == 'Q':break
    if msg.isdigit():
        msg = int(msg)
        if msg <= int(len(dic)):
             print(dic[msg])
        else:
            print('输入数值超出范围')
    else:
        print('输入有误,并重新输入')

#
while 1:
    for i in goods:
        '''
        enumrate() 枚举。。。。
        '''
        print(goods.index(i) + 1, i['name'], i['price'])
    choice_num = input('请输入>>>').strip()
    if choice_num.isdigit():
        '''
        if 范围,1 ~ 4
            num = input

        '''

    else:
        print('您输入的有非数字元素,请重新输入')
#
#
#
#
#
#
# 明日默写内容。
#
# 1)字典的增删改查。
# 2)过滤敏感字符代码的默写。
#
# li = ["苍老师", "东京热", "武藤兰", "波多野结衣"]
# l1 = []
# comment = input('请输入评论>>>')
# for i in li:
#     comment = comment.replace(i, '*' * len(i))
# l1.append(comment)
# print(l1)
#
答案

 

# 商品列表:
#      goods = [{"name": "电脑", "price": 1999},
#          {"name": "鼠标", "price": 10},
#          {"name": "游艇", "price": 20},
#          {"name": "美女", "price": 998}, ]
#
# 要求:
# 1:页面显示 序号 + 商品名称 + 商品价格,如:
#               1 电脑 1999
#                2 鼠标 10
#
# 2:用户输入选择的商品序号,然后打印商品名称及商品价格
# 3:如果用户输入的商品序号有误,则提示输入有误,并重新输入。
# 4:用户输入Q或者q,退出程序。

goods = [{"name": "电脑", "price": 1999},
         {"name": "鼠标", "price": 10},
         {"name": "游艇", "price": 20},
         {"name": "美女", "price": 998}, ]

while 1:
    print('****商品具体展示:****')
    for index,i in enumerate(goods,1):
        print('{}\t{}\t{}'.format(index,i['name'],i['price']))
    print('*********************')
    choice_num = input('输入商品序号:').strip()
    if choice_num.isdigit():
        if 0 < int(choice_num) <= len(goods):
            print(goods[int(choice_num)-1]['name'])
        else:
            print('超出范围,重新选择...')
    else:
        print('请输入数字,请重新输入')
goods打印答案二

 

list3 = [
    {"name": "alex", "hobby": "抽烟"},
    {"name": "alex", "hobby": "喝酒"},
    {"name": "alex", "hobby": "烫头"},
    {"name": "alex", "hobby": "Massage"},
    {"name": "wusir", "hobby": "喊麦"},
    {"name": "wusir", "hobby": "街舞"},
    {"name": "wusir", "hobby": "唱歌"},
    {"name": "太白", "hobby": "开车"},
]
list4 = [
    {"name": "alex", "hobby_list": ["抽烟", "喝酒", "烫头", "Massage"]},
    {"name": "wusir", "hobby_list": ["喊麦", "街舞"]},
]
# 将list3 这种数据类型转化成list4类型,你写的代码必须支持可拓展,
# 比如list3 数据在加一个这样的字典{"name": "wusir", "hobby": "溜达"},    你的list4{"name": "wusir", "hobby_list": ["喊麦", "街舞", "溜达"],
# 或者list3增加一个字典{"name": "太白", "hobby": "开车"},
# 你的list4{"name": "太白", "hobby_list": ["开车"],无论按照要求加多少数据,你的代码都可以转化.如果不支持拓展,则4分,支持拓展则8分.

# {'alex':{"name": "alex", "hobby_list": ["抽烟", "喝酒", "烫头", "Massage"]
#     'wusir':{"name": "wusir", "hobby_list": ["喊麦", "街舞"]}
# }
dic ={}
for l in list3:
    print(l['name'],l['hobby'])
    if l['name'] in dic:
        dic[l['name']]['hobby_list'].append(l['hobby'])
    else:
        dic[l['name']] = {'name':l['name'],'hobby_list':[l['hobby']]}
print(dic)
"抽烟", "喝酒", "烫头", "Massage"

 

#{'alex': {'name': 'alex', 'hobby_list': ['抽烟', '喝酒', '烫头', 'Massage']}, 'wusir': {'name': 'wusir', 'hobby_list': ['喊麦', '街舞', '唱歌']}, '太白': {'name': '太白', 'hobby_list': ['开车']}}
print(dic.values())
#dict_values([{'name': 'alex', 'hobby_list': ['抽烟', '喝酒', '烫头', 'Massage']}, {'name': 'wusir', 'hobby_list': ['喊麦', '街舞', '唱歌']}, {'name': '太白', 'hobby_list': ['开车']}])
print(list(dic.values()))
[{'name': 'alex', 'hobby_list': ['抽烟', '喝酒', '烫头', 'Massage']}, {'name': 'wusir', 'hobby_list': ['喊麦', '街舞', '唱歌']}, {'name': '太白', 'hobby_list': ['开车']}]
抽烟喝酒烫头继续转化

最终结果

 posted on 2022-03-12 13:58  编程之路任重道远  阅读(107)  评论(0)    收藏  举报