《Python编程快速上手——让繁琐的工作自动化》读书笔记4

其实,写这个是为了督促自己看书……然后 ……其实没有然后了,人一松懈下来,就……ε=(´ο`*)))唉

第五章 字典和结构化数据

①字典数据类型

像列表一样,“字典”是许多值的集合。但不像列表的下标,字典的索引可以使用许多不同数据类型,不止是整数。字典的索引被称为“键”,键及其关联的值被称为“键-值”对。

在代码中,字典输入时带花括号{}。在交互环境中输入一下代码:

>>>myCat={'size':'fat','color':gray',disposition':'loud'}

这将给字典赋给myCat变量。这个字典的键是'size'、'color'、'disposition'。这些键相应的值是'fat'、'gray'和‘loud'。可以通过他们的键访问这些值:

>>>myCat['size']
'fat'
>>'My cat has '+myCat['color']+' fur.'
'My cat has gray fur.'

字典仍然可以用整数值作为键,就像列表用整数值作为下标一样,但是不要求一定要从0开始,可以是任何数字。
                                                                                                                                                               

                                                                                                                                                                               ——摘自书81~82页

------------------------那个……再歪个楼-----------------------

昨天在做这题的时候:

发现,真的很多东西,乍一看很好解决,真到自己写的时候,就……

比如,怎么去掉字符串中间的空格,怎么把大写字母转换为小写字母,怎么统计字母出现的次数……种种难题,使我到现在都没把这题A掉,超级蓝瘦(T ^ T)。

不过是真的觉得PY真是黑科技,一行代码可以实现好多功能。

……

又跑题了,对,是要记录一下,这些功能怎么实现。

首先,去掉字符串中间的空格。

string=' soft kitty  warm kitty   little ball of fur~~    happy kitty sleepy kitty  pur pur pur~~                   '

先是字符串↑,我们发现,字符串左右两边都有空格

⑴去掉左边的空格——lstrip

string=' soft kitty  warm kitty   little ball of fur~~    happy kitty sleepy kitty  pur pur pur~~                   '
string.lstrip()
print(string)

输出:

 soft kitty  warm kitty   little ball of fur~~    happy kitty sleepy kitty  pur pur pur~~    #右边一直到这里哦

⑵去掉右边的空格——rstrip

与上面的用法相同:字符串名.函数名()#string.rstrip()

⑶去掉左右两边的空格——strip

与上面的用法相同:字符串名.函数名()#string.strip()


补充:


⑷去掉中间的空格

法一:split()
split():通过指定分隔符对字符串进行切片,如果参数num 有指定值,则仅分隔 num 个子字符串

string=' soft kitty  warm kitty   little ball of fur~~    happy kitty sleepy kitty  pur pur pur~~                   '
print(string.split())


output:

['soft', 'kitty', 'warm', 'kitty', 'little', 'ball', 'of', 'fur~~', 'happy', 'kitty', 'sleepy', 'kitty', 'pur', 'pur', 'pur~~']

当然,还可以自定义操作,见点击打开链接

In[3]: a = 'dfdfd*dfjdf**fdjfd*22*'
In[4]: a
Out[4]: 'dfdfd*dfjdf**fdjfd*22*'
In[5]: a.split('*')
Out[5]: ['dfdfd', 'dfjdf', '', 'fdjfd', '22', '']
In[6]: a.split('*',2)
Out[6]: ['dfdfd', 'dfjdf', '*fdjfd*22*']


法二:replace

>>> a = 'hello world'

>>> a.replace(' ', '')
'helloworld'


法三:使用正则表达式

>>> import re
>>> strinfo = re.compile()

>>> strinfo = re.compile(' ')

>>> b = strinfo.sub('', a)
>>> print(b)
helloworld


法四:先转换成列表……在列表中删除……

法五:循环删除……

哭唧唧,那么多方法,最后还是A不了题


大小写转化

这个简单,见百度知道……点击打开链接

可以直接通过str类的swapcase方法可以快速实现大写便小写、小写变大写的功能。

In [1]:s='Baidu Zhidao'
In [2]:s.swapcase()
Out[2]:'bAIDU zHIDAO'
与swapcase类似的还有lower和upper方法,它们分别实现将字符串全部变为小写和全部变为大写的功能。

In [3]: s.upper()
Out[3]:'BAIDU ZHIDAO'

In [4]: s.lower()
Out[4]:'baidu zhidao'

统计字母出现次数(终于讲到字典了,✿✿ヽ(°▽°)ノ✿)

先说单个字母,就是只统计一个字母的那种

string=input()
s=string.lower()
emm=list(s.replace(' ',''))
emm.sort()
print(emm)
num=emm.count(emm[0])
print(emm[0],num)

↑这个是昨天写的代码的修改版,当然,还是不对,就是展示一下count函数的

>>> '1,2,3'.count(',')<br />
2<br />
>>> 'Hello world'.count('l')<br />
3<br />

酱紫,就可以了。大家看,那个,即使已经是列表了,也是可以用的。

然后是统计很多字符:

from collections import Counter

string=input()
s=string.lower()
emm=list(s.replace(' ',''))
print (Counter(emm).most_common(4))

>>> string = 'hello world'
>>> { a:string.count(a) for a in set(string.replace(' ','')) }
{'h': 1, 'e': 1, 'w': 1, 'l': 3, 'o': 2, 'd': 1, 'r': 1}
用的是字典推导式和str自带的统计方法str.count

作者:匿名用户
链接:https://www.zhihu.com/question/67528074/answer/254847319
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

点击打开链接



判断是字母还数字

str_1 = "123"
str_2 = "Abc"
str_3 = "123Abc"

#用isdigit函数判断是否数字
print(str_1.isdigit())
Ture
print(str_2.isdigit())
False
print(str_3.isdigit())
False

#用isalpha判断是否字母
print(str_1.isalpha())    
False
print(str_2.isalpha())
Ture    
print(str_3.isalpha())    
False

#isalnum判断是否数字和字母的组合
print(str_1.isalpha())    
False
print(str_2.isalpha())
False
print(str_1.isalpha())    
Ture

----------------------------------楼好像歪了不少----------------------------


#希望大家还能记得是在第五章,要继续讲一讲字典……

#刚刚翻了一下书,还有好多啊,好绝望,不想写了,但是已经立了flag了,哭唧唧

spam=['cat', 'dogs', 'moose']
bacon=['dogs', 'moose', 'cat']
print(spam==bacon)#output:False
eggs={'name': 'Zophie','species': 'cat','age': '8'}
ham={'species': 'cat','age': '8','name': 'Zophie'}
print(eggs==ham)#output:True



列表和字典的区别还是很明显的,就像数列和集合的区别一样,列表中一个个元素不仅有自己的值还有特定的位置,而字典就像集合,只要在里面就万事大吉。--》字典是不排序的,列表是排序的。

尝试访问不在字典中的键('age'),将导致KeyError报错。

eggs={'name': 'Zophie','species': 'cat'}
print(eggs['age'])

报错信息

Traceback (most recent call last):
  File "/usercode/file.py", line 29, in <module>
    print(eggs['age'])
KeyError: 'age'

字典又是一个很万精油的东西,不挑,任意值都可以作为键,比如书上举例如何将好友的生日作为值,名字作为键。

birthdays={'Alice':'Apr 1','Bob':'Dec 12','Carol':'Mar 4'}
while True:
    print('Enter a name :(blank to quit)')
    name=input()
    if name==' ':
        break
    if name in birthdays:
        print(birthdays[name]+' is the birthday of '+name)
    else:
        print('I do not have birthday information for '+name)
        print('What is their birthday?')
        bday=input()
        birthdays[name]=bday
        print('Birthday database updated.')

当然,这里的数据在程序终止之后,都会丢失,具体如何保存,将在以后的笔记中提到(其实是还没看到那部分)



②keys()、values()和items()方法

有3个字典方法,他们将返回类似列表的值,分别对应字典是键、值和键-值对:keys()、values()和items()。

但是

这些方法返回的不是真正的列表,他们不能被修改,不能应用append()方法。

不过,

这些数据类型(dict_keys、dict_values和dict_items)可以用于for循环。

比如:

spam={'color':'red','age':42}
for v in spam.values():
    print(v)
'''
output:
42
red
'''
这里for循环迭代了spam字典中的每个值。for循环也可以迭代每个键或者键值对:

spam={'color':'red','age':42}
for k in spam.keys():
    print(k)
'''
output:
color
age
'''
for i in spam.items():
    print(i)
'''
output:
('age', 42)
('color', 'red')
'''

items()方法返回的dict_items值中,包含的是键和值的元组,如果想得到真正的列表哦,就要吧类似列表的返回值传递给list()
#多重赋值
spam={'color':'red','age':42}
for k,v in spam.items():
    print('Keys: '+k+' Values: '+str(v))

output:

Keys: color Values: red
Keys: age Values: 42


--------再歪一个楼---------

据说本书提供源码来着

然后给了这个网址:

https://nostarch.com/automatestuff/

具体……我刚刚打开了,有一个

我估计八成是这个,然后就下载了

下载下来的是一个打开之后,看起来是源码


……

所以,我想说的是

……

那个,小程序的代码我就不放了

……

迅速逃走……

---------------------------------



③检查字典中是否存在键或值

法一:和列表方法类似:

键 in 字典名.keys()

值 in 字典名.values()

返回True或False

也可以采取简写形式,比如:

spam={'name':'Zophie','age':7}

'color' in spam.keys()与'color' in spam都会返回False


法二:get()方法

用于在访问某一个键的值之前,检查该键是否在字典里。

picnicItems={'apples':5,'cups':2}
print('I am bringing '+str(picnicItems.get('cups',0))+' cups.')
print('I am bringing '+str(picnicItems.get('eggs',0))+' eggs.')
'''
output:
I am bringing 2 cups.
I am bringing 0 eggs.
'''


如果不用get():

Traceback (most recent call last):
  File "/usercode/file.py", line 2, in <module>
    print('I am bringing '+str(picnicItems['eggs'])+' eggs.')
KeyError: 'eggs'




④setdefault()方法


D = {'Name': 'Runoob', 'Age': 7}
 
print ("Age 键的值为 : %s" %  D.setdefault('Age','25')) # 键存在在字典中则不会设置为指定值
print ("Sex 键的值为 : %s" %  D.setdefault('Sex', 'NA')) # 键不存在,指定一个值
print ("School 键的值为 : %s" %  D.setdefault('School')) # 键不存在,不指定值,默认为None
print ("新字典为:", D)
输出:
Age 键的值为 : 7
Sex 键的值为 : NA
School 键的值为 : None
新字典为: {'Name': 'Runoob', 'School': None, 'Sex': 'NA', 'Age': 7}

再比如:

'''
picnicItems={'apples':5,'cups':2}
if 'eggs' not in picnicItems:
    picnicItems['eggs']=2
print(picnicItems)
'''
"""
上面的内容完全可以写作:
"""
picnicItems={'apples':5,'cups':2}
picnicItems.setdefault('eggs',2)
print(picnicItems)

picnicItems={'apples':5,'cups':2}
picnicItems.setdefault('eggs',2)
picnicItems.setdefault('eggs',3)
print(picnicItems)#output:{'apples': 5, 'cups': 2, 'eggs': 2}
'''
即使在后面更改,其实也没有什么作用,这不禁让我想到了const关键字……
'''



⑤漂亮打印

本来不想再写这个的,但是,为终于可以打印正常字典打call……

方法:

在程序中导入pprint模块,就可以使用pprint()和pformat()函数。

--------------------再歪个楼--------------------

刚刚找到疑似资料

https://docs.python.org/2/library/pprint.html

-----------------------------------------------------

import pprint 

message='The amount of indentation added for each recursive level is specified by indent; the default is one. Other values can cause output to look a little odd, but can make nesting easier to spot. '
count={}

for character in message:
    count.setdefault(character,0)
    count[character]=count[character]+1
pprint.pprint(count)

输出:

{' ': 34,
 ',': 1,
 '.': 2,
 ';': 1,
 'O': 1,
 'T': 1,
 'a': 12,
 'b': 2,
 'c': 6,
 'd': 9,
 'e': 22,
 'f': 4,
 'g': 1,
 'h': 4,
 'i': 11,
 'k': 2,
 'l': 7,
 'm': 2,
 'n': 11,
 'o': 12,
 'p': 3,
 'r': 5,
 's': 9,
 't': 16,
 'u': 8,
 'v': 3,
 'y': 1}


如果希望打印的是字符串,可以调用pprint.pformat()

print(pprint.pformat(count))


pprint.pprint(count)

等价


'''
好啦,就先到这里啦ヾ(◍°∇°◍)ノ゙
'''

----------------这里是更新的分割线---------------------

from collections import Counter

string=input()
newS=''
string= ''.join(string.split())
string.replace('.','')
for s in string:
    if s.isalpha():
        newS+=s
s=''
s=newS.lower()
emm=[]
emm=list(s)
emm.sort()
wa=[]
wa=(Counter(emm).most_common(1))
#print(wa)
#print (wa[0][0])
#print(wa[1][0])
#tup=tuple(wa)
#print(tup)
#for x in tup:   
#    print(x)
stri=''
stri=str(wa)
#print(stri)
print(stri[3],stri[7])


之前提过这道题,然后,这个代码……通过的概率……是不确定的……

绝对不是我的问题……


猜你喜欢

转载自blog.csdn.net/karen_yu_/article/details/79314403