python challenge 2:迭代与列表
python challenge 2:迭代与列表
http://www.pythonchallenge.com/pc/def/equality.html
本关在网页源代码中给了数量巨大的乱码字符串,要求找出隐藏在里面出现次数很少的字符
说起统计字符,那自然而然地想到使用python的字典dic
>>> for c in s: if c.isalpha(): if d.has_key(c): d[c]+=1 else: d[c]=1 >>> for k in d: print k,d[k] e 1 q 1 u 1 a 1 l 1 i 1 t 1 y 1
看到了结果原来每个字母只出现了一次啊?那就好办了,直接按字母出现的顺序排成字符串即可
d="" for c in s: if c.isalpha(): d+=c
写得更pythonist就是
print ''.join([c for c in s if c.isalpha()])
解释一下上面解题用到的python相关内容:
三种列表类型的创立
list1=[] #建立一个空列表 dic1={} #建立一个空字典 tuple1=(1,2,3) #建立元组后不能改变,所以一般不建立空元祖
1、字典
三种建立字典的方法
dic1={'a':1,'b':2} dic2=dict((['a',1],['b',2])) #里面的括号作用是把列表变成一个变量 dic3={}.fromkeys(['x','y'],1)
字典可以直接迭代
for key in dict1: print key,dict1[key]
字典的其他操作
del dict1['a'] #删除一个item dict1.clear() #清空字典 del dict1 #删除整个字典 dict1.keys() #返回所有键的列表 dict1.values() #返回所有值的列表 dict1.items() #返回所有键值对的列表 ‘x’ in dic1 #判断x是否是dic1的键,相当于 dic1.has_key('x')
说完了字典,再说说最基础的列表
列表的操作都比较简单,跟C的数组差不多,不同的是迭代方式和分片
for i in range(0,10): #i从0到9迭代 >>> for i,val in enumerate(list1): print i,val 0 a 1 b 2 c
range可以使用下标迭代,enumerate可以自己给出列表的下标及值,非常方便
>>> list1[1:] ['b', 'c'] >>> list1[:2] ['a', 'b'] >>> list1[0:2] ['a', 'b']
列表的分片返回的也是一个列表。注意的是,分片区间是一个左闭右开区间,[a:b),并不包含下标为b的元素
>>> list2=set(list1)
>>> list2=list(list2)
对了,使用集合set的类型函数可以给列表、元组去掉重复的元素