python学习值字典和集合

集合定义总结

  • 创建一个空集合必须用 set() 而不是 { }.{ } 是用来创建一个空字典。
  • 集合里面的元素必须是不可变的数据类型。
  • 通过set方法可以将列表/元组/字符串转换成集合数据类型。
>>> s1 = {}
>>> type(s1)

>>> s2 = {1, 2, 3}
>>> type(s2)

>>> s3 = {1, 3.14, True, 'hello', [1, 2, 3], (1, 2, 3)}
Traceback (most recent call last):
  File "", line 1, in 
TypeError: unhashable type: 'list'
>>> s3 = {1, 3.14, True, 'hello',(1, 2, 3)}
>>> type(s3)

>>> s4 = set([])
>>> type(s4)

>>> s5 = set('abcde')
>>> s5
{'c', 'e', 'b', 'a', 'd'}
>>> type(s5)

集合(set)是一个无序的不重复元素序列。1,2,3,4,1,2,3 = 1,2,3,4
集合的创建:
1). 使用大括号 { } 或者 set() 函数创建集合;
2). 注意:
l 创建一个空集合必须用 set() 而不是 { }
l { } 是用来创建一个空字典。

创新互联主营桦南网站建设的网络公司,主营网站建设方案,app软件开发,桦南h5微信小程序开发搭建,桦南网站营销推广欢迎桦南等地区企业咨询

集合常用方法

#1). 集合的增加
#add: 添加单个元素到集合中
#update: 添加多个元素到集合中
set1 = { 1, 2, 3 }
set1.add(4)
print(set1)
set1.add(3)
print(set1)

set1.update({2, 3, 4, 5, 6})
print(set1)

#2). 集合的删除
#remove: 如果元素存在, 直接删除, 如果不存在, 抛出异常KeyError。
#discard:如果元素存在, 直接删除, 如果不存在, do nothing。
#pop:随机删除指定元素, 并返回删除的值。
#clear:清空集合。
set2 = {1, 2, 3, 4}
set2.remove(2)
print(set2)

#集合是一个无序的数据类型。最后增加的元素不一定存储在集合最后。
#无序意味着索引值会随时变化, 因此不可以索引和切片。
set2 = {9991, 29, 33, 4}
print(set2)
set2.add(11)
print(set2)
set2.pop()
print(set2)

set2 = {1, 2, 3, 4}
set2.discard(5)
print(set2)

#set2 = {1, 2, 3, 4}
#set2.remove(5)
#print(set2)

set2.clear()
print(set2)

#3). 集合的查看
set1 = {1, 2, 3}
set2 = {1, 2, 4}
print("交集是: ", set1 & set2)      # {1, 2}
print("并集是: ", set1 | set2)      # {1, 2, 3, 4}
print("差集是: ", set1 - set2)      # {3}          set1 - set2 = set1 - (set1 & set2)
print("差集是: ", set2 - set1)      # {4}          set2 - set1 = set2 - (set1 & set2)
print("对等差分是: ", set2 ^ set1)   # {3, 4}        (set1 | set2) - (set1 & set1)

"""
set1 = {1, 2, 3}
set2 = {1, 2, 4}
print("交集是: ", set1.intersection(set2))      # {1, 2}
#print("交集是: ", set1.intersection_update(set2))      # {1, 2}   set1 = set1 & set2
print("并集是: ", set1.union(set2))             # {1, 2, 3, 4}
print("差集是: ", set1.difference(set2))      # {3}          set1 - set2 = set1 - (set1 & set2)
print("差集是: ", set2.difference(set1))      # {4}          set2 - set1 = set2 - (set1 & set2)
print("对等差分是: ", set1.symmetric_difference(set2))   # {3, 4}        (set1 | set2) - (set1 & set1)

set3 = {1, 2}
set4 = {1, 2, 4}
print(set3.isdisjoint(set4))    # False
print(set3.issubset(set4))      # True
print(set4.issuperset(set3))    # True

总结:
python学习值字典和集合
URL地址去重:

urls = [
    'http://www.baidu.com',
    'http://www.qq.com',
    'http://www.qq.com',
    'http://www.163.com',
    'http://www.csdn.com',
    'http://www.csdn.com',
]

#用来存储去重的url地址
analyze_urls = []

#依次遍历所有的url
for url in urls:
    #如果url不是analyze_urls列表成员, 则追加到列表最后。
    #如果url是analyze_urls列表成员,不做任何操作。
    if url not in analyze_urls:
        analyze_urls.append(url)
print("去重之后的url地址: ", analyze_urls)
"""

urls = [
    'http://www.baidu.com',
    'http://www.qq.com',
    'http://www.qq.com',
    'http://www.163.com',
    'http://www.csdn.com',
    'http://www.csdn.com',
]

print("去重之后的url地址: ",set(urls))

华为笔试编程题: 明明的随机数:

明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的
随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学
生的学号。然后再把这些数从大到小排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与
“排序”的工作(同一个测试用例里可能会有多组数据,希望大家能正确处理)。

1). 生成了N个1到1000之间的随机整数(N≤1000)
2). 去重: 其中重复的数字,只保留一个,把其余相同的数去掉
3). 从大到小排序
"""

import random
#2). 去重: 其中重复的数字,只保留一个,把其余相同的数去掉.生成一个空集合
nums = set()
N = int(input('N: '))
#1). 生成了N个1到1000之间的随机整数(N≤1000)
for count in range(N):
    num = random.randint(1, 1000)
    nums.add(num)

#3). 从大到小排序, li.sort()智能对列表进行排序; sorted()方法可以对任意数据类型排序。
print(sorted(nums, reverse=True))

frozenset应用:
#1). 当集合元素不需要改变时,使用 frozenset 代替 set 更安全。
#2). 当某些 API 需要不可变对象时,必须用 frozenset 代替set。

set1 = frozenset({1, 2, 3, 4})
print(set1, type(set1))

set2 = {1, 2, set1}
print(set2)

字典的定义:

#1). 字典可以快速通过key值查询到value值。O(1)
#2). key值是不能重复的, value值无所谓
#3). 字典的key值必须是不可变的数据类型, value值可以是任意数据类型。

info = {
    'name' : 'root',   # key:value  ===> 键:值  key-value对/键值对
    'password': 'westos',
    'member': ['kiosk', 'student']

}
print(type(info))
print(info)

#pprint==pretty print,更加美观/友好的打印模块
import pprint

#需求: 创建100个银行卡号, 6103452xxx: 6103452001, 6103452002,.........6103452100, 这些银行卡号的初始密码为666666.
#1). 生成100个卡号, 存储在列表中

cards = []
for count in range(100):
    num = "%.3d" %(count+1)
    card = '6103452' + str(num)
    cards.append(card)
#2). 快速生成卡号和密码的对应关系, 存储在字典中;
cards_info = {}.fromkeys(cards, 'westos')
pprint.pprint(cards_info)

"""

#zip间接创建

info = zip(['name', 'passwd'], ['root', 'westos'])
#print(list(info))
print(dict(info))

#通过dict传值的方式创建字典

info = dict(name='root', passwd='westos')
print(info)

字典的查看

students = {
'user1': [100, 100, 100],
'user2': [98, 100, 100],
'user3': [100, 89, 100],
}

#通过字典的key获取对应的value值;
print(students['user1'])
#print(students['user4']) # KeyError: 'user4', 因为key值在字典中不存在

#特别重要: get方法: 如果key存在获取对应的value值, 反之, 返回默认值(如果不指定,默认返回的是None)

print(students.get('user1'))    # [100, 100, 100]
print(students.get('user4', 'no user'))    # 'no user'

#查看所有的key值/value值/key-value值
print(students.keys())
print(students.values())
print(students.items())     # key-value值 [(key1, value1),(key2, value2)]

循环遍历字典:

##for循环字符串
#for item in 'abc':
#print(item)
##for循环元组
#for item in (1, 2, 3):
#print(item)
##for循环集合
#for item in {1, 2, 3}:
#print(item)

students = {
    'user1': [100, 100, 100],
    'user2': [98, 100, 100],
    'user3': [100, 89, 100],
}

#字典遍历时默认遍历的时字典的key值
for key in students:
    print(key, students[key])

#遍历字典key-value建议的方法
for key,value in students.items():    # [('user1', [100, 100, 100]), ('user2', [98, 100, 100]), ('user3', [100, 89, 100])]
    # key,value = ('user1', [100, 100, 100])
    #key,value = ('user2', [98, 100, 100])
    #key,value = ('user3', [100, 89, 100])
    print(key, value)

字典的增加方法

import pprint

students = {
    'user1': [100, 100, 100],
    'user2': [98, 100, 100],
    'user3': [100, 89, 100],
}

#1). 根据key增加 /修改key-value
#如果key存在, 修改key-value
#如果key不存在, 增加key-value
students['user4'] = [90, 99, 89]
print(students)

#2). setdefault方法
#如果key存在, 不做任何操作
#如果key不存在, 增加key-value
students.setdefault('user1', [100, 89, 88])
print(students)

#3). update方法: 批量添加key-value
#如果key存在, 修改key-value
#如果key不存在, 增加key-value
new_student = {
    'westos':[100, 100, 100],
    'root':[100, 100, 100],
    'user1':[0, 0, 0]
}
students.update(new_student)
pprint.pprint(students)

字典的删除方法

students = {
    'user1': [100, 100, 100],
    'user2': [98, 100, 100],
    'user3': [100, 89, 100],
}

##1). del dict[key]
##如果key存在, 删除对应的value值
##如果key不存在, 抛出异常KeyError
#del students['user1']
#print(students)
##2). pop方法
##如果key存在, 删除对应的value值
##如果key不存在,如果没有提供默认值, 则抛出异常KeyError
#delete_item = students.pop('user6', 'no user')
#print("删除的元素是: ", delete_item)
#print(students)

#3). popitem方法: 随机删除字典的key-value值
key, value = students.popitem()
print("随机删除的内容: ", key, value)

总结:
python学习值字典和集合

列表去重的第三种方法

方法三: 通过字典的方式去重, 因为字典的key值是不能重复的.
"""

nums = [1, 2, 3, 1, 2, 3, 6, 7]
print({}.fromkeys(nums).keys())        # {1: None, 2: None, 3: None, 6: None, 7: None}  ==> [1, 2, 3, 6, 7]

默认字典defaultdict

from collections import defaultdict

info = defaultdict(int)
info['a'] += 1
print(info['a'])

info = defaultdict(list)
info['a'].append(1)
print(info['a'])

info = defaultdict(set)
info['a'].add(1)
print(info['a'])
默认字典应用:

from collections import defaultdict

#1). 随机生成50个1-100之间的随机数

import random
nums = []
for count in range(50):
    nums.append(random.randint(1, 100))

#2). 把list中大于66的元素和小于66的元素分类存储
sort_nums_dict = defaultdict(list)      # 创建一个默认字典, 默认的value为空列表[]
for num in nums:
    if num > 66:
        sort_nums_dict['大于66的元素'].append(num)
    else:
        sort_nums_dict['小于66的元素'].append(num)
print(sort_nums_dict)

md5加密的实现:

#md5加密需要传递的时bytes类型
passwd = b'westos'
md5_passwd = hashlib.md5(passwd).hexdigest()
print(md5_passwd)

#tkinter
#PySimpleGUI
from string import  digits
#Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。hashlib库进行md5加密,操作如下
import hashlib
#显示程序运行的进度条
from tqdm import tqdm
import json

db = {}
for item1 in tqdm(digits):
    for item2 in digits:
        for item3 in digits:
            for item4 in digits:
                for item5 in digits:
                    for item6 in digits:
                        passwd1 = item1  + item2 + item3 + item4 + item5 + item6
                        #md5加密需要的字符串时bytes类型, 将utf-8的编码格式编码成bytes类型
                        passwd = passwd1.encode('utf-8')
                        md5_passwd = hashlib.md5(passwd).hexdigest()
                        db[md5_passwd] = passwd1

#将db字典的信息以json的格式存储到md5.json文件中
json.dump(db, open('md5.json', 'w'))
print("生成数据库成功.......")

新闻标题:python学习值字典和集合
文章链接:http://myzitong.com/article/gpjogi.html