练习:元素分类有如下值集合[11,22,33,44,55,66,77,88,99,90...],执行如下。即:{'k1':大于66的所有值,'k2':小于66的所有值}
set1=[11,22,33,44,55,66,77,88,99,90]set2=[]set3=[]foriinset1:ifi>66:set2.append(i)else:set3.append(i)printset2,set3ViewCode例子二、列表与字典结合应用
元素分类有如下值集合[11,22,33,44,55,66,77,88,99,90...],将所有大于66的值保存至字典的第一个key中,将小于66的值保存至第二个key的值中。即:{'k1':大于66的所有值,'k2':小于66的所有值}
li=[11,22,33,44,55,66,77,88,99,90]dic={}foriteminli:ifitem>66:if'k2'indic.keys():dic['k2'].append(item)else:#创建只有一项元素的列表,注意如果只有一项的话要加个逗号dic['k2']=[item,]#这里是添加一个字典else:if'k1'indic.keys():dic['k1'].append(item)else:dic['k1']=[item,]printdicViewCode习题三:
在一个文件里面的内容如下,前面是代表账号,后面代表密码,最后一个是访问记录,要把这个文件读出来,生成一个如下字典模式
Alex|123|1
Eric|123|1
Tony|123|1
Dic={
‘alex’:[123,1],
‘eric’:[123,1],
‘tony’:[123,1]
}
#步骤一、打开文件,读取文件内容obj=file('log','r')line_list=obj.readlines()obj.close()#['xxx|123|1\n','Eric|123|1\n','Tony|123|1'],转化为字典dic={}forlineinline_list:#去掉换行和空格line=line.strip()#分割成列表字符串ele_line=line.split("|")#转化为字典dic[ele_line[0]]=ele_line[1:]printdicViewCode为在pythcarm中不想没创建一个文件就输入utf-8这种就可以在pycharm创建模板如下所示:
二、collection系列
创建字典的方法:
1)dic={“k”:12}
2)dic=dict(k=12)
A
1、计数器
Counter是对字典的一个补充
ClassCounter(dict):
上面括号里面是dict说明这个是扩展的字典,如果里面是list那么这个就是扩展的列表
C=Counter(‘abcdefabcdabcdbacd’)
>>>importcollections
>>>c=collections.Counter('abc')
>>>c=collections.Counter('abcdacbsdacbaabe')
1、
>>>c.most_common(n)→数量从大到写排列,获取前N个元素[('a',5),('b',4),('c',3)]ViewCode2、
1>>>sorted(c)→列出c中各个元素2['a','b','c','d','e','s']ViewCode3、
>>>''.join(sorted(c.elements()))→给c中的元素进行排序按照出现的次数,并且可以添加分隔符'aaaaabbbbcccddes'>>>'|'.join(sorted(c.elements()))'a|a|a|a|a|b|b|b|b|c|c|c|d|d|e|s'ViewCode4、
update方法,把两个字典之类的相加>>>importcollections>>>collections.Counter('aabc')Counter({'a':2,'c':1,'b':1})>>>c1=collections.Counter('aabc')>>>c2=collections.Counter('aac')>>>c1Counter({'a':2,'c':1,'b':1})>>>c2Counter({'a':2,'c':1})>>>c1.update(c2)---》两个相加>>>c1Counter({'a':4,'c':2,'b':1})ViewCode5、
clear清除>>>c1.clear()>>>c1Counter()ViewCode6、
1elements2这是一个迭代器,也就是说只有循环遍历才可以把迭代器里面的内容拿出来3Foriterminc1.elements():ViewCode7、
subtract相减>>>c1.subtract(c2)>>>c1Counter({'b':1,'a':0,'c':0})ViewCode8、
扩展列表collections.Counter(li)>>>li=[11,12,13,12,11,44,124,11]>>>c1=collections.Counter(li)>>>c1Counter({11:3,12:2,44:1,13:1,124:1})ViewCodeB、有序字典有序字典和其他字典的区别是有序字典内部进行了排序
collections.OrderedDict()
>>>o1=collections.OrderedDict()>>>o1['k1']=1>>>o1['k2']=2>>>o1['k3']=3>>>o1OrderedDict([('k1',1),('k2',2),('k3',3)])ViewCodeC、默认字典(defaultdict),为字典里的value设置默认类型my_dict=collections.defaultdict(list)
首先要明白下面的:Dic={’k1’:None}这个时候dic的value是none就不能用append方法,如果velue是列表,那么就可以用append方法要解决上面的问题就要用到现在的方法my_dict=collections.defaultdict(list)习题:要往上面的字典里面添加元素dic=collections.defaultdict(list)dic[’k1’].append(1)下面的省略了。dic={},dic[’k1’]=[]dic=collections.defaultdict(list)ViewCodeD、可命名的元祖(用来表示平面图横坐标纵坐标,用来指定具体的值
方法:collections.namedtuple('mytuple',['x','y'])创建类使用类创建对象使用对象>>>importcollections>>>mytuple=collections.namedtuple('mytuple',['x','y'])--》创建类mytple>>>n=mytuple(1,2)---》使用类创建对象>>>n--》使用对象mytuple(x=1,y=2)--》指定元祖>>>n.x1>>>n.y2>>>o=tuple([1,2])ViewCode三、双向队列q=collections.deque()
双向队列有助于线程安全,双向都可以取classdeque(object):defappend():defappendleft():放到左边defclear():清除defcount():个数defextend():往右边添加defextendleft():往左边添加defpop():拿出最后的数并且删除defpopleft():拿出最左边的数并删除Defremove():移除Defreverse():反转这个队列Defrotate():旋转方法代码如下>>>q=collections.deque()>>>q.append(1)>>>q.append(11)>>>q.append(12)>>>q.append(13)>>>qdeque([1,11,12,13])>>>q.pop()拿出最后的然后删除13>>>qdeque([1,11,12])>>>q.popleft()拿出左边的然后删除1>>>qdeque([11,12])>>>q.remove(11)删除指定的元素>>>qdeque([12])>>>qdeque([12,1,12,13,14,15])>>>q.rotate(2)让最后面的两个数旋转到最前面>>>qdeque([14,15,12,1,12,13])>>>q.rotate(-2)把最左边的两个数旋转到最后面>>>qdeque([12,1,12,13,14,15])ViewCode四、单向队列
单向队列只能再一边操作importQueue>>>q=Queue.Queue(10)创建了一个单向队列,这个队列最多可以放入10条数据>>>q.put(1)添加数据>>>q.put(2)>>>q.put(3)>>>q.get()1>>>q.get()取出数据2>>>q.get()3>>>q.get()这里是夯住了,走不动了,就是必须要取出来,不取出来就在这里等着队列和栈是不一样的队列:FIFO先进先出栈:弹夹先进后出队列之间的区别:单向队列:只能从一个方向取双向队列:两个方向都可以取ViewCode五、迭代器和生成器
1、迭代器>>>importcollections>>>c1=collections.Counter('1111')#创建了一个类>>>c1.elements()
li=[1,2,3,4,5,6]#这个循环式按照值循环foriinli:printi#这个循环按照列表下标循环forlinrange(len(li)):printli[l]printl冒泡排序初步:forminrange(len(li)-1):ifli[m+1]>li[m]:tmp=li[m+1]+li[m]li[m+1]=tmp-li[m+1]li[m]=tmp-li[m]printli