美文网首页
collections之Counter ,ChainMap,na

collections之Counter ,ChainMap,na

作者: 三人行大道 | 来源:发表于2018-11-15 10:23 被阅读0次
又是统计

Counter 是dict的一个子类

# 可以统计字符串,字典,列表,元祖,等可迭代对象
from collections import Counter
users = ["jing", "jing2", "jing3", "jing4","jing", "jing2","jing", "jing2",]
user_counter = Counter(users)
print(user_counter)


user_co = Counter("adsgadskjgalhklsahdk")
user_co.update("alkdlfdni")  #这里的update 是 把上面的user_co 和下面的user_co 一起做的统计
print(user_co)

user_co = Counter("adsgadskjgalhklsahdk")
user_co2 = Counter("iagudiewquj")
user_co.update(user_co2)
print(user_co)


# 统计出来出现次数最多的前n个元素
# 这里统计出来前两个
# top n 堆(数据结构)
user = Counter("qwertyuiop[asdfghjklz")
print(user.most_common(2))

from collections import ChainMap

user_dict1 = {"a":"jing1","b":"yue2"} #{"a":"jing1","b":"yue2"} 如果 “b” 出现两次,那么 打印出来的结果只会出来一次,
user_dict2 = {"c":"jing2", "d":"yue3"}

new_dict = ChainMap(user_dict1,user_dict2) #合并
new_dict.new_child({"aa":"bb" })

print(new_dict.new_child({"aa":"bb" })) #新增 (这里是copy)

print(new_dict.maps) #把字段转换为列表

new_dict.maps[0]["a"]="jingda" #这里不是copy
for key,value in new_dict.items():
    print(key,value)

c2 = Counter("hannaha")
c3 = Counter(['Python', 'Swift', 'Swift', 'Python', 'Kotlin', 'Python'])
c4 = Counter({"red":4,"blue":2})
c5 = Counter(Python=4,Swift=8)
打印结果是:
 Counter({'a': 3, 'h': 2, 'n': 2}) 
 Counter({'Python': 3, 'Swift': 2, 'Kotlin': 1}) 
 Counter({'red': 4, 'blue': 2}) 
 Counter({'Swift': 8, 'Python': 4})
每一个元素出现的次数

namedtuple

==============================
写在前面,对于可迭代对象:__iter__,__getitem__
只要实现这里面的其中一个就是可迭代对象
1.tuple的功能
2.拆包
name_tuple = ("name", 26, "男", "上海市")
name,age,sex,city= name_tuple
print(name), print(age),print(sex),print(city)
3.tuple的不可变性
4.tuple比list好的地方
    (1):immutable的重要性
           (1):性能优化:
           (2):线程安全
           (3):可以作为dict的key(最重要的一个点)(可哈希)
            (4):拆包特性
   (2)关于C语言的对比


==============================
2.namedtuple详解
(1): class User:
        def __init__(self, name, age);
            self.name = name
            self.age = age
user = User(name="jing", age=26)
print(user.age,user.name) 

这里才是重点
from collections import namedtuple
U = namedtuple("User", ["name", "age", "height"])
# U就相当于一个类,user相当于一个U实例化出来的一个实例对象,其中name,age,height 就是一个个的属性
user = U(name="jing", age=26, height=172)
# U就相当于一个类,user相当于一个U实例化出来的一个实例对象,其中name,age,height 就是一个个的属性
print(user.age, user.name, user.height)


现在有一个实例:
web项目中的user表
把user表的数据全部取出来然后加一个列
如果不用orm,而是用 pymysql,原始方法来取的话,那样取出来的是一个tuple,然后映射成U,

1.
U = namedtuple("User", ["name", "age", "height","edu"])
user_tuple = ("jing",27,175)
user = User(*user_tuple, "master")
print(user.age, user.name,user.height)

2.
U = namedtuple("User", ["name", "age", "height","edu"])
user_dict = (
"name":"jing",
"age":27,
"height":175)
user = User(**user_tuple, edu = "master")
user_info_dict = user._asdict() 将tuple转化为dict
print(user.age, user.name,user.height)




下面这两个函数 介绍*args**kwargs 传参
*args ==>tuple
**kwargs ===>dict

def ack(*args, **kwargs):
    pass
ack("jing", 26)

def ack(*args, **kwargs):
    pass
ack(name= "jing", age =  26)

defaultdict 是 dict 的子类,因此 defaultdict 也可被当成 dict 来使用,dict 支持的功能,defaultdict 基本都支持。但它与 dict 最大的区别在于,如果程序试图根据不存在的 key 采访问 dict 中对应的 value,则会引发 KeyError 异常;而 defaultdict 则可以提供一个 default_factory 属性,该属性所指定的函数负责为不存在的 key 来生成 value

defaultdict
#统计
from collections import defaultdict
#1
user_dict = {}
users = ["jing", "jing2", "jing3", "jing4","jing", "jing2","jing", "jing2",]
for user in users:
    if user not in user_dict:
        user_dict[user] = 1
    else:
        user_dict[user] +=1
print(user_dict)


>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
from collections import defaultdict
s = [('Python', 1), ('Swift', 2), ('Python', 3), ('Swift', 4), ('Python', 9)]
# 创建defaultdict,设置由list()函数来生成默认值
d = defaultdict(list)
for k, v in s:
    # 直接访问defaultdict中指定key对应的value即可。
    # 如果该key不存在,defaultdict会自动为该key生成默认值
    d[k].append(v)
print(list(d.items()))

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

strings = ('puppy', 'kitten', 'puppy', 'puppy',
           'weasel', 'puppy', 'kitten', 'puppy')
counts = {}

for kw in strings:
    if kw not in counts:
        counts[kw] = 1
    else:
        counts[kw] += 1

# counts:
# {'puppy': 5, 'weasel': 1, 'kitten': 2}

使用setdefault 
strings = ('puppy', 'kitten', 'puppy', 'puppy',
           'weasel', 'puppy', 'kitten', 'puppy')
counts = {}

for kw in strings:
    counts.setdefault(kw, 0)
    counts[kw] += 1 

dict.setdefault()方法接收两个参数,第一个参数是健的名称,第二个参数是默认值。假如字典中不存在给定的键,则返回参数中提供的默认值;反之,则返回字典中保存的值





#2 2比1 搞笑
#Python字典 setdefault() 函数和get() 方法类似, 如果键不存在于字典中,将会添加键并将值设为默认值
user_dict = {}
users = ["jing", "jing2", "jing3", "jing4","jing", "jing2","jing", "jing2",]
for user in users:
    user_dict.setdefault(user, 0)
    user_dict[user] +=1
print(user_dict)

#defaultdict  除了dict的功能外,还有一个功能是,如果键不存在,会赋值一个默认的值
# list,int 等可调用对象
# default_dict = defaultdict(list)

# defaultdict中只能传可调用的对象
default_dict = defaultdict(int)
users = ["jing", "jing2", "jing3", "jing4","jing", "jing2","jing", "jing2",]
for user in users:
    default_dict[user] +=1
print(default_dict)


相关文章

网友评论

      本文标题:collections之Counter ,ChainMap,na

      本文链接:https://www.haomeiwen.com/subject/eebefqtx.html