【python】collections + dict

collections

https://www.cnblogs.com/herbert/archive/2013/01/09/2852843.html

dict

未初始化,插入keys不存在的情况

dic = {}
lis = [1,2,4,2,4,5,1]
for i in lis:
    if(i not in dic.keys()):
        dic[i] = 1
    else:
        dic[i] += 1
print(dic)

或者用下面这种方法

dic = {}
lis = [1,2,4,2,4,5,1]
for i in lis:
    dic[i] = dic.get(i,0)+1
print(dic)

批量初始化

Name = ['a','b','c','d']
hour = dict().fromkeys([str(i) for i in range(1,3)],0.00)
Val = dict().fromkeys([i for i in Name],hour)
temp = dict().fromkeys([i for i in Name])
print(hour)
print(Val)
print(temp)

输出:

{‘1’: 0.0, ‘2’: 0.0}
{‘a’: {‘1’: 0.0, ‘2’: 0.0}, ‘b’: {‘1’: 0.0, ‘2’: 0.0}, ‘c’: {‘1’: 0.0, ‘2’: 0.0}, ‘d’: {‘1’: 0.0, ‘2’: 0.0}}
{‘a’: None, ‘b’: None, ‘c’: None, ‘d’: None}

按key排序

有个坑,排序之后就不是dict类型了,而是list了

dic={'a':7,'b':2,'c':3}
dic_sor = dict(sorted(dic.keys(),reverse=True))
print(dic_sor) # 按照 递减 排序 reverse=true
# 只返回键值 ['c', 'b', 'a']
import operator
dic={'a':7,'b':2,'c':3}
dic_sor = dict(sorted(dic.items(),key=operator.itemgetter(0),reverse=False))
print(dic_sor)
# 如果不强转一步,则返回键对值 [('a', 7), ('b', 2), ('c', 3)]
# 转一步,就会还是dict类型

按value排序

# 方法一:需要迭代器
import operator
dic={'a':7,'b':2,'c':3}
print(sorted(dic.items(),key=operator.itemgetter(1),reverse=False))
# 返回的是键对值 [('b', 2), ('c', 3), ('a', 7)]
# 方法二:不需要迭代器
dic={'a':7,'b':2,'c':3}
print(sorted(dic.items(),key = lambda x:x[1],reverse = True))
# 返回的是键对值 [('a', 7), ('c', 3), ('b', 2)]

对list中dict排序

info= [{'ID':11,'name':'lili','age':20},
        {'ID':2,'name':'jobs','age':40},
        {'ID':22,'name':'aces','age':30},
        {'ID':15,'name':'bob','age':18}]
print(sorted(info,key=lambdax:x['ID'])) #sort by ID
'''out:
[{'ID':2, 'name': 'jobs', 'age': 40}, 
{'ID': 11, 'name': 'lili', 'age': 20}, 
{'ID':15, 'name': 'bob', 'age': 18}, 
{'ID': 22, 'name': 'aces', 'age': 30}]'''

多级排序

print(sorted(info,key=lambdax:(x['name'],x['age'])))
print(sorted(info,key=itemgetter("name",'age')))
'''out:
[{'ID': 22, 'name': 'aces', 'age': 30}, 
{'ID': 15, 'name': 'bob', 'age': 18},
{'ID': 2, 'name': 'jobs', 'age': 40}, 
{'ID': 11, 'name': 'lili', 'age': 20}]
'''

遍历

d = {'a':1,'b':5,'c':46}
for i in d:
    print(i,d[i])
for key,value in d.items():
    print(key,value)

输出:
a 1
b 5
c 46

字典一键值对多值

# 保存字符的位置
strs = ['a','a','b','b','c','c','c']
dic = {}

for i in range(len(strs)):    
    dic.setdefault(strs[i],[]).append(i)  # 将字典后的设置成一个list
d = [[]]
for key in dic.keys():
    d.append(list(dic[key])) # 按照字典的键值创建新的list
print(d[1:])
# [[0, 1], [2, 3], [4, 5, 6]]
for i in range(len(d)):
    for j in range(len(d[i])):
        print(d[i][j])

输出:
0
1
2
3
4
5
6

Count

d = {}
cur = 1
i = 0
d[(cur, i)] = 1
i += 1
d[(cur, i)] = 2
i += 1
d[(cur, i)] = 3
print(d.get((cur, i), int(cur == 1)))

结果输出3

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Pythoncollections模块是一个用于实现特定目标容器的模块,它提供了一些替代标准内建容器(如dict、list、set和tuple)的选择。该模块包含了一些有用的数据结构和容器类型,可以帮助我们更方便地处理数据。 以下是collections模块中一些常用的数据结构和容器类型的介绍: 1. Counter(计数器):Counter是一个用于计数的容器,它可以帮助我们快速统计一个可迭代对象中各个元素的出现次数。可以使用Counter类来创建一个计数器对象,并使用它的方法进行计数操作。 2. defaultdict(默认字典):defaultdict是一个字典的子类,它可以为字典中不存在的键提供一个默认值。当我们访问一个不存在的键时,defaultdict会自动创建一个默认值,并将其作为该键的值返回。 3. OrderedDict(有序字典):OrderedDict是一个有序字典,它会记住元素的插入顺序。与普通字典不同,OrderedDict会保持元素的顺序不变,无论是通过插入还是通过更新。 4. namedtuple(命名元组):namedtuple是一个创建具有命名字段的元组的工厂函数。它可以帮助我们创建一个具有可读性和自文档性的数据结构。 5. deque(双端队列):deque是一个双端队列,它可以在两端高效地进行插入和删除操作。与列表相比,deque在插入和删除元素时具有更好的性能。 6. ChainMap(链式映射):ChainMap是一个将多个字典或映射组合在一起的工具。它可以将多个字典或映射视为一个逻辑上的整体,并提供统一的访问接口。 7. namedtuple(命名元组):namedtuple是一个创建具有命名字段的元组的工厂函数。它可以帮助我们创建一个具有可读性和自文档性的数据结构。 8. defaultdict(默认字典):defaultdict是一个字典的子类,它可以为字典中不存在的键提供一个默认值。当我们访问一个不存在的键时,defaultdict会自动创建一个默认值,并将其作为该键的值返回。 9. OrderedDict(有序字典):OrderedDict是一个有序字典,它会记住元素的插入顺序。与普通字典不同,OrderedDict会保持元素的顺序不变,无论是通过插入还是通过更新。 10. deque(双端队列):deque是一个双端队列,它可以在两端高效地进行插入和删除操作。与列表相比,deque在插入和删除元素时具有更好的性能。 11. ChainMap(链式映射):ChainMap是一个将多个字典或映射组合在一起的工具。它可以将多个字典或映射视为一个逻辑上的整体,并提供统一的访问接口。 以上是collections模块中一些常用的数据结构和容器类型的介绍。你可以根据自己的需求选择合适的数据结构来处理数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值