python数据结构--集合、字典

一、集合set

可变的、无序的、不重复的元素的集合

set的元素要求必须可以hash,set可以迭代,元素不可以索引

定义:s=set()、s=set(iterable)

set元素增加:

s.add(elem)增加一个元素到set中,如果元素存在,什么都不做

s.update(*other)合并其他元素到set中,参数other必须是可迭代对象,就地修改

set删除元素:

s.remove(elem)从set中移除一个元素,元素不存在抛出keyerror

s.discard(elem) 从set中移除一个元素,元素不存在什么都不做

s.pop()移除并返回任意的元素,空集返回keyerror

s.clear()移除所有元素

set非线性结构,无法索引,要么删除,要么加入新的元素,没有修改的方法

可以对所有的元素进行遍历

线性结构的查询时间复杂度是O(n),即随着数据规模的增大而增加耗时

set,dict等结构,内部使用hash值作为key,时间复杂度可以做到O(1),查询时间和数据规模无关

可hash类型:数值型int,float,complex、布尔型True,False、字符串string,bytes、元组tuple、None、以上都是不可变类型,称为可哈希类型,hashable

二、字典dict

可变的、无序的、key不重复、key-value键值对的数据的集合

定义:d=dict()、d={}、d=dict(**kwargs)使用name=value对初始化一个字典

   d=dict(iterable,**kwargs)使用可迭代对象和name=value对构造字典,不过可迭代对象的元素必须是 一个二元结构。    d = dict(((1,'a'),(2,'b'))) 或者 d = dict(([1,'a'],[2,'b'])) 

   dict(mapping, **kwarg) 使用一个字典构建另一个字典

   dict(mapping, **kwarg) 使用一个字典构建另一个字典。d = dict.fromkeys(range(5))、d = dict.fromkeys(range(5),0)

字典元素的访问

d[key]返回key对应的值value ,key不存在抛出KeyError异常 

d.get(key[, default]) 返回key对应的值value ,key不存在返回缺省值,如果没有设置缺省值就返回None 

d.setdefault(key[, default]) 返回key对应的值value ,key不存在,添加kv对,value为default,并返回default,如果default没有设置,缺省为None

字典的增加和修改

d[key] = value  将key对应的值修改为value, key不存在添加新的kv对 

d.update([other]) -> None 使用另一个字典的kv对更新本字典 , key不存在,就添加 ,key存在,覆盖已经存在的key对应的值 , 就地修改 

d.update(red=1)、 d.update((('red',2),)) 、d.update({'red':3})

字典的删除

d.pop(key[, default]) key存在,移除它,并返回它的value ,key不存在,返回给定的default ,default未设置,key不存在则抛出KeyError异常 

d.popitem() 移除并返回一个任意的键值对 ,移除并返回一个任意的键值对 

d.clear() 清空字典

字典的遍历

遍历key:for k in d:print(k)、for k in d.keys(): print(k)

遍历value: for k in d: print(d[k])、for k in d.keys(): print(d.get(k))、for k in d.keys(): print(d.get(k))

遍历item,即kv对 :for item in d.items(): print(item) 、for item in d.items(): print(item[0], item[1]) 、for k,v in d.items(): print(k, v) 

字典遍历和移除

若直接移除k,会影响字典的长度,而在遍历的过程中是不能改变字典的长度的。

defaultdict

 collections.defaultdict([default_factory[, ...]]) 第一个参数是default_factory,缺省是None,它提供一个初始化函数。当key不存在的时候,会调用 这个工厂函数来生成key对应的value  

strings = ('puppy', 'kitten', 'puppy', 'puppy',
'weasel', 'puppy', 'kitten', 'puppy')
d = {}
for words in strings:
d[words] += 1
print(d)
上面一段代码对单词出现的次数进行统计,但是由于d[words]没有默认值,无法进行+=计算,此时会抛keyerror
要解决这个问题,首先可能想到的方法是在单词第一次统计的时候,在d中相应的键存下默认值1。这需要在处理的时候添加一个判断语句:
strings = ('puppy', 'kitten', 'puppy', 'puppy',
           'weasel', 'puppy', 'kitten', 'puppy')
d = {}

for words in strings:
    if words not in d:
        d[words] = 1
    else:
        d[words] += 1

# d:
# {'puppy': 5, 'weasel': 1, 'kitten': 2}
这样就解决了value的默认值的问题,也可以通过dict.setdefault()方法来设置默认值:
strings = ('puppy', 'kitten', 'puppy', 'puppy',
           'weasel', 'puppy', 'kitten', 'puppy')
d = {}

for words in strings:
    d.setdefault(words, 0)
    d[words] += 1 
print(d)
dict.setdefault()方法接收两个参数,第一个参数是健的名称,第二个参数是默认值。假如字典中不存在给定的键,则返回参数中提供的默认值;反之,则返回字典中保存的值。
使用defaultdict实现:
defaultdict类的初始化函数接受一个类型作为参数,当所访问的键不存在的时候,可以实例化一个值作为默认值:
from collections import defaultdict
d = defaultdict(list)
print(d['a']) =>[]
如上会设置value的默认值为[]
需要注意的是,这种形式的默认值只有在通过dict[key]或者dict.__getitem__(key)访问的时候才有效

defaultdict类除了接受类型名称作为初始化函数的参数之外,还可以使用任何不带参数的可调用函数,到时该函数的返回结果作为默认值,这样使得默认值的取值更加灵活:
from collections import defaultdict
def zero():
     return 0
d = defaultdict(zero)
print(d['a']) =>0
利用collections.defaultdict来解决单词统计问题:
from collections import defaultdict

strings = ('puppy', 'kitten', 'puppy', 'puppy',
           'weasel', 'puppy', 'kitten', 'puppy')
d = defaultdict(lambda: 0)  # 使用lambda来定义简单的函数

for words in strings:
   d[words] += 1

通过上面的内容,想必大家已经了解了defaultdict类的用法,那么在defaultdict类中又是如何来实现默认值的功能呢?这其中的关键是使用了看__missing__()这个方法:
>>> from collections import defaultdict
>>> print defaultdict.__missing__.__doc__
__missing__(key) # Called by __getitem__ for missing key; pseudo-code:
  if self.default_factory is None: raise KeyError(key)
  self[key] = value = self.default_factory()
  return value
通过查看__missing__()方法的docstring,可以看出当使用__getitem__()方法访问一个不存在的键时(dict[key]这种形式实际上是__getitem__()方法的简化形式),会调用__missing__()方法获取默认值,并将该键添加到字典中去。

OrderDict
collections.OrderedDict([items])  key并不是按照加入的顺序排列,可以使用OrderedDict记录顺序 
from collections import OrderedDict
import random
d = {'banana': 3, 'apple': 4, 'pear': 1, 'orange': 2}
print(d)
keys = list(d.keys())
random.shuffle(keys)
print(keys)
od = OrderedDict()
for key in keys:
od[key] = d[key]
  print(od)
print(od.keys())

 有序字典可以记录元素插入的顺序,打印的时候也是按照这个顺序输出打印        

猜你喜欢

转载自www.cnblogs.com/s-p-l/p/10193348.html