collections

set

set 表示一个集合, 支持很多集合运算

In [1]:
t1 = [1, 1, 3, 4, 5, 4, 5]
t2 = [8, 7, 6, 5, 3, 2, 1]
s1, s2 = set(t1), set(t2)
print('s1 = ', s1 )
print('s2 = ', s2 )
print('s1 - s2 = ' , s1 - s2)
print('s2 - s1 = ' , s2 - s1)
print('s2 - s1 <= s1 : ', s2 - s1 <= s1) #  判断s2 与 s1的差集是否是 s1的子集
print('s2 - s1 <= s2 : ', s2 - s1 <= s2) #  判断s2 与 s1的差集是否是 s2的子集
print('s1 <= s2 : ', s1 <= s2)           #  判断s1 是否是 s2 的子集
s1 =  {1, 3, 4, 5}
s2 =  {1, 2, 3, 5, 6, 7, 8}
s1 - s2 =  {4}
s2 - s1 =  {8, 2, 6, 7}
s2 - s1 <= s1 :  False
s2 - s1 <= s2 :  True
s1 <= s2 :  False
In [2]:
s3 = s1.intersection(s2)  # 计算 s1 与 s2 的交集
print('s3 = ', s3)
s4 = s1.union(s2)
print('s4 = ', s4)       # 计算 s1 与 s2 的并集
s3 =  {1, 3, 5}
s4 =  {1, 2, 3, 4, 5, 6, 7, 8}

Counter

Counter 是一个计数器, 提供了一些与计数相关的功能
Counter 是一个特殊的字典, 可用任意可以迭代的序列进行初始化, 键为对应的序列元素, 值为整数, 表示各元素出现的次数
需要指出的是, 用于初始化Counter的序列中的元素必须是可哈希的

In [15]:
from collections import Counter

count = Counter("A woman's heart is the deep ocean of secret")
print(count) # count 统计了各元素出现的次数, 并对元素按照次数从高到低进行了排序
print(count['B']) # 如果访问的元素没有出现过, Counter将返回0, 而不会报错

for key, freq in count.most_common():  # most_common返回一个由key-value pairs组成的list, 并且是排好序的
    print(key, freq)
Counter({' ': 8, 'e': 7, 'o': 3, 'a': 3, 's': 3, 't': 3, 'n': 2, 'h': 2, 'r': 2, 'c': 2, 'A': 1, 'w': 1, 'm': 1, "'": 1, 'i': 1, 'd': 1, 'p': 1, 'f': 1})
0
  8
e 7
o 3
a 3
s 3
t 3
n 2
h 2
r 2
c 2
A 1
w 1
m 1
' 1
i 1
d 1
p 1
f 1

defaultdict

defaultdict 与 dict 非常相似, 只不过当你访问一个不存在的元素时, 它不会报错, 而是生成一个默认值作为该键的值
创建 defaultdict 时需要提供一个类名用于创建相应的默认值

In [19]:
from collections import defaultdict

# 当要创建一个值为list的字典时, 使用defaultdict会很方便
# 例如这里要统计上面那个Counter中出现相同次数的字符有哪些, 可以这样做

dd = defaultdict(list)   # 注意这里的list是类名, 不是函数, 也不是对象

for key, freq in count.most_common():
    dd[freq].append(key)   # 这里就不用判断访问的键有没有出现过
    
for key, val in dd.items():
    print(key,' : ', val)
8  :  [' ']
7  :  ['e']
3  :  ['o', 'a', 's', 't']
2  :  ['n', 'h', 'r', 'c']
1  :  ['A', 'w', 'm', "'", 'i', 'd', 'p', 'f']

namedtuple

当我们定义像java bean( 类中只有一些属性, getter, setter, 以及toString() 等函数 )那样的简单类时, python提供了更简单的工具
来帮我们生成一种数据类型, 它就是namedtuple

In [39]:
from collections import namedtuple

Person = namedtuple('Person', ['name', 'age', 'sex' ])
# 第一个参数 'Person' 表示要创建的类型的名字,
# 第二个参数是一个list, 表示要创建的类型具有的属性, list中的元素必须是字符串, 且能表示一个合法的标识符

print(Person)
print(list)
print(dict)
print(int)

# 可以看到, Person和list, dict 等一样都是class, 只不过 Person 是定义在__main__这个作用域里面而已
<class '__main__.Person'>
<class 'list'>
<class 'dict'>
<class 'int'>
In [40]:
ps = Person('jack', 20, 'male')  # 使用 类型名() 的语法格式创建对象
print( ps )                                   # namedtuple自动帮我们写好了__str__ 函数

print(ps.name, ps[1], ps.sex)   #可以通过下标和小数点的方式访问对象的属性
name, age, sex = ps                # 还能像tuple一样自动进行 scatter 操作
print(name, age, sex) 

ps2 = Person(name='bob', age=21, sex='male')  # 还可以使用关键字参数创建 Person对象
print(ps2)
Person(name='jack', age=20, sex='male')
jack 20 male
jack 20 male
Person(name='bob', age=21, sex='male')
In [42]:
# 当我们需要为该类增加新功能时, 可以创建一个新类继承自用 namedtuple创建的类
class Student(Person):
    def __init__(self, *args, **kw):
        pass