网址:https://github.com/raynardj/python4lq/blob/main/1.2_lesson2.ipynb
大纲:介绍列表、字典、元祖、集合
一、列表
[ ]
可以返回列表中的值
#注意列表内容的缩进并不严格
month_ab = ["dec", "jan", "feb", "mar",
"apr", "may", "jun",
"jul", "aug", "sep",
"oct", "nov"
]
print("The 1st month:\t",month_ab[0])
print("The 3rd month:\t",month_ab[2])
print("The last month:\t",month_ab[-1])
print("The 3rd to 6th month:\t",month_ab[2:6])
print("The first 2 month:\t",month_ab[:2])
print("The last 3 month:\t",month_ab[-3:])
print("Reverse the time!:\n",month_ab[::-1])
输出:
The 1st month: dec
The 3rd month: feb
The last month: nov
The 3rd to 6th month: ['feb', 'mar', 'apr', 'may']
The first 2 month: ['dec', 'jan']
The last 3 month: ['sep', 'oct', 'nov']
Reverse the time!:
['nov', 'oct', 'sep', 'aug', 'jul', 'jun', 'may', 'apr', 'mar', 'feb', 'jan', 'dec']
上述从大列表变成小列表的过程叫做切片
使用你新获得的切片技能返回4个列表:
spring = month_ab[:3]
summer = month_ab[3:6]
autumn = month_ab[6:9]
winter = month_ab[9:]
print(spring,summer,autumn,winter)
输出:
['dec', 'jan', 'feb'] ['mar', 'apr', 'may'] ['jun', 'jul', 'aug'] ['sep', 'oct', 'nov']
还记得列表的元素可以是任何东西吗?这意味着一个列表可以包含更小的列表
year = [spring, summer, autumn, winter]
print(year)
#[['dec', 'jan', 'feb'], ['mar', 'apr', 'may'], ['jun', 'jul', 'aug'], ['sep', 'oct', 'nov']]
进阶:
century = [year] * 5
print(century)
print("The 3rd years of a century,\n 3rd season, \n the last month", century[2][2][-1])
输出:
[[['dec', 'jan', 'feb'], ['mar', 'apr', 'may'], ['jun', 'jul', 'aug'], ['sep', 'oct', 'nov']], [['dec', 'jan', 'feb'], ['mar', 'apr', 'may'], ['jun', 'jul', 'aug'], ['sep', 'oct', 'nov']], [['dec', 'jan', 'feb'], ['mar', 'apr', 'may'], ['jun', 'jul', 'aug'], ['sep', 'oct', 'nov']], [['dec', 'jan', 'feb'], ['mar', 'apr', 'may'], ['jun', 'jul', 'aug'], ['sep', 'oct', 'nov']], [['dec', 'jan', 'feb'], ['mar', 'apr', 'may'], ['jun', 'jul', 'aug'], ['sep', 'oct', 'nov']]]
The 3rd years of a century,
3rd season,
the last month is: aug
二、列表中的元素
a = list("Eye of the tiger")
print(a)
print(list(i/3 for i in range(6)))
print(list(list((range(i))) for i in range(6)))
print(1==1)
print(2==1)
print(list(i%2==0 for i in range(6)))
输出:
['E', 'y', 'e', ' ', 'o', 'f', ' ', 't', 'h', 'e', ' ', 't', 'i', 'g', 'e', 'r']
[0.0, 0.3333333333333333, 0.6666666666666666, 1.0, 1.3333333333333333, 1.6666666666666667]
[[], [0], [0, 1], [0, 1, 2], [0, 1, 2, 3], [0, 1, 2, 3, 4]]
True
False
[True, False, True, False, True, False]
练习
这里有一些提示,猜猜在你运行“shift+enter”之前会出现什么:
list0=list("WordsWillBeScatteredToLetters")
list1=[0,True,3>5,4==6,20>10>0]
list2=list(range(6))
list3=[list2,list1+list0]
print(list0)
print(list1)
print(list2)
print(list3)
out:
['W', 'o', 'r', 'd', 's', 'W', 'i', 'l', 'l', 'B', 'e', 'S', 'c', 'a', 't', 't', 'e', 'r', 'e', 'd', 'T', 'o', 'L', 'e', 't', 't', 'e', 'r', 's']
[0, True, False, False, True]
[0, 1, 2, 3, 4, 5]
[[0, 1, 2, 3, 4, 5], [0, True, False, False, True, 'W', 'o', 'r', 'd', 's', 'W', 'i', 'l', 'l', 'B', 'e', 'S', 'c', 'a', 't', 't', 'e', 'r', 'e', 'd', 'T', 'o', 'L', 'e', 't', 't', 'e', 'r', 's']]
三、循环
1、简单形式
for i in month_ab:
Up=i.upper() #upper case of a string
print(Up)
out:
DEC
JAN
FEB
MAR
APR
MAY
JUN
JUL
AUG
SEP
OCT
NOV
生成一个列表
MONTH_UP=list(i.upper() for i in month_ab)
print(MONTH_UP)
#['DEC', 'JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV']
2、if
Month_Start_With_J=list(i for i in month_ab if list(i)[0]=="j")
print(Month_Start_With_J)
#['jan', 'jun', 'jul']
3、if not in
Month_Not_Start_With_J=list(i for i in month_ab if i not in Month_Start_With_J)
print(Month_Not_Start_With_J)
#['dec', 'feb', 'mar', 'apr', 'may', 'aug', 'sep', 'oct', 'nov']
4、简写
squares=[i**2 for i in range(10)]
print(squares)
#[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
5、列表推导式
summer = month_ab[3:6]
print(eval("summer"))
print(summer)
#两个输出相同
out:
['mar', 'apr', 'may']
['mar', 'apr', 'may']
eval() 函数用来执行一个字符串表达式,并返回表达式的值。
实例
以下展示了使用 eval() 方法的实例:
>>>x = 7
>>> eval( '3 * x' )
21
>>> eval('pow(2,2)')
4
>>> eval('2 + 2')
4
>>> n=81
>>> eval("n + 4")
85
season_names=["spring","summer",
"autumn","winter"]
# A combination of 2 expressions:
for season in season_names: list(print(season+":"+mon) for mon in eval(season))
# #也可以这样写:
for season in season_names:
list(print(season+":"+mon) for mon in eval(season))
输出:
spring:dec
spring:jan
spring:feb
summer:mar
summer:apr
summer:may
autumn:jun
autumn:jul
autumn:aug
winter:sep
winter:oct
winter:nov
有关python列表推导式的更多信息:http://treyhunner.com/2015/12/python-list-comprehensions-now-in-color/
现在想象一下用其他编程语言写这些
如果熟悉这些表达式,就可以更快地编写循环
注意,不要以这种方式对非常大的数据样本进行代码循环,python有专门的模块来加快对更大数据的循环
让我们休息一下,讨论一下数据格式
四、操作数据格式
字符串的连接很简单:
myname="Ray"
print("My name is "+myname)
#My name is Ray
但我们不能这样做浮点数,运行以下程序,你会遇到错误
# print("My name is" + myname + " and my height is" + 1.8532)
#可以这样写
print("My name is %s and my height is %.2f m"%(myname,1.8532))
#My name is Ray and my height is 1.85 m
%s表示字符串,但也有其他格式,请参阅:https://pyformat.info/
练习
1、创建一个看起来像“Dec”,“Jan”…(如“Nov”),每个月的第一个字母大写
a = [mon.capitalize() for mon in month_ab]
print(a)
# ['Dec', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov']
2、假设你有48名员工为你工作,每个月有4名员工可以领取你的奖金,你要为他们准备信封,给我一个像["Dec_1","Dec_2","Dec_3","Dec_4","Jan_1",…,"Nov_3","Nov_4"]的清单
allP = list()
for i in a:
allP = allP + [i+"_"+str(num) for num in range(1,5)]
print(allP)
五、集合
Set就像一个列表,但不同,你应该记住的最重要的特质是:集合包含唯一的项,集合不能包含列表
girlfriend=list(["love","love"])
print(girlfriend)
# this is how you declare a set
wife=set(["love","love"]) # build on a list
parents={"mother","father"} # declare with curly braces
print(wife)
print(parents)
输出:
['love', 'love']
{'love'}
{'mother', 'father'}
可以使用updata增加元素:
girlfriend=girlfriend+["love"] #列表值可重复,不支持updata
wife.update(["love"])
parents.update(["father"])
print(girlfriend)
print(wife)
print(parents)
输出:
['love', 'love', 'love']
{'love'}
{'father', 'mother'}
老实说,我只在需要删除重复元素时才使用set:
longstring=list("Night gathers and here my watch begins")
shrink=list(set(longstring))
print(shrink)
print("".join(shrink))
输出:
['t', 'N', 'm', 'e', 'h', ' ', 'a', 'r', 's', 'c', 'b', 'i', 'w', 'g', 'y', 'n', 'd']
tNmeh arscbiwgynd
如果你想删除列表中的重复元素,在一个集合中运行它,然后将它转换回列表是最快的方法。
您还可以看到,该集合不显示序列的原始顺序。
List保留原始序列。集合不能。
所以更有理由使用list。
六、字典
Dictionary是我最喜欢的简单性之一,在PHP、Javascript等语言中,list和Dictionary是不同类型的数组。但这里很清楚。
Dictionary是键/值对的集合。是的,一组,因为不应该有相同的对。(至少没有相同的键)。
字典最重要的特点是:“成对”。
字典的一个好处是,你可以查找一个条目(键)
那么,键是唯一的。
isRepublican={"obama":False,
"trump":True,
"romney":True,
"clinton":False,
"sanders":False,
"rubio":True,
}
# All keys should be unique
fromHouse = {
"Tyrion":"Lannister",
"Eddard":"Stark",
"Catelyn":"Tully",
"Jon":"Stark",
"Jaime":"Lannister",
"Robert":"Baratheon",
"Theon":"Greyjoy",
"Daenerys":"Targaryen",
"Aegon":"Targaryen",
}
print(isRepublican["obama"])
print(fromHouse["Jaime"])
#out:
#False
#Lannister
迭代器有一点不一样:
for key in fromHouse.keys():# Don't forget the ()
print("Greetings, I am "+key)
输出:
Greetings, I am Tyrion
Greetings, I am Eddard
Greetings, I am Catelyn
...
for v in fromHouse.values():
print("I'm from house \"%s\""%(v)) # use \" to express double quotes inside double quotes
输出:
I'm from house "Lannister"
I'm from house "Stark"
I'm from house "Tully"
...
for k, v in fromHouse.items():
print("=" * 60 + "\nI'm %s of house \"%s\""%(k,v))
输出:
============================================================
I'm Tyrion of house "Lannister"
============================================================
I'm Eddard of house "Stark"
============================================================
I'm Catelyn of house "Tully"
============================================================
....
candidates=["%s"%(k) for k in isRepublican.keys()]
candidates_1=[k for k in isRepublican.keys()]
print(candidates)
print(candidates_1)
#['obama', 'trump', 'romney', 'clinton', 'sanders', 'rubio']
#['obama', 'trump', 'romney', 'clinton', 'sanders', 'rubio']
Is_Repulican=dict((k[0].upper()+k[1:],v) for k,v in isRepublican.items())
Is_Repulican_1={(k[0].upper()+k[1:],v) for k,v in isRepublican.items()} #出错,不建议使用
print(Is_Repulican)
print(Is_Repulican_1)
#{'Obama': False, 'Trump': True, 'Romney': True, 'Clinton': False, 'Sanders': False, 'Rubio': True}
#{('Sanders', False), ('Romney', True), ('Clinton', False), ('Obama', False), ('Trump', True), ('Rubio', True)}
进阶:def
for k in Is_Repulican.keys():
def trueFalseToWords(x):return "" if Is_Repulican[x] else "not "
print("%s is %sa Replican presidential candidate"%(k,trueFalseToWords(k)))
#Meanwhile this is equally true
for k,v in Is_Repulican.items():
def trueFalseToWords(isr):return "" if isr else "not "
print("%s is %sa Replican presidential candidate"%(k,trueFalseToWords(v)))
Enumerate()可以使用.items()将列表转换为有编号的字典。
##candidates=['obama', 'trump', 'romney', 'clinton', 'sanders', 'rubio']
print(dict((k,v) for k,v in enumerate(candidates)))
print(dict((v,"candidate No:%s"%(k)) for k,v in enumerate(candidates)))
输出:
{0: 'obama', 1: 'trump', 2: 'romney', 3: 'clinton', 4: 'sanders', 5: 'rubio'}
{'obama': 'candidate No:0', 'trump': 'candidate No:1', 'romney': 'candidate No:2', 'clinton': 'candidate No:3', 'sanders': 'candidate No:4', 'rubio': 'candidate No:5'}
七、元组
另一种数据类型。
元组不是很常用,它在传递形状和参数时很有用。
您已经多次接触tuple
print(1,2,3)
#1 2 3
你有么有想过什么是1,2,3
a=1,2,3
print(a)
print(a[0],a[-1])
print(type(a))
#输出:
(1, 2, 3)
1 3
<class 'tuple'>
任何被“,”分隔但没有被[],{}覆盖的东西都是元组
x, y = aFunctionReturn2Values ()
那么x,y是一个元组。
元组用于表示少量的数据。
人们通常不会在上面写太多的计算。
x,y=1,2; print(x)
a,b,c,d,e=tuple(i**2 for i in range(5)); print(a,c,e)
ace=a,c,e;print(ace[-1])
输出:
1
0 4 16
16
练习
请不要手动输入任何数据,使用代码创建变量
1、创建一个字典whichSeason,这样我就可以检查whichSeason["Jan"]="winter"
whichSeason = {"Jan":"winter"}
print(whichSeason["Jan"])
2、创建一个字典houseMap,键是房子的名字,值是一个人员列表:
houseMap["stark"]=["Eddard","Jon"]
houseMap["Baratheon"]=["Robert"]
houseMap = {"stark":["Eddard","Jon"],
"Baratheon":["Robert"]}
print(houseMap["stark"],houseMap["Baratheon"])
3、如果每个共和党人和民主党人都要单独进行辩论,给我一个详尽的名单,告诉我他们是如何配对的,并在字典中编号:
注意人们不会和同党派的人争论。
match={1:["Obama","Romney"],2:["Obama","Trump"]...}
["Obama","Romney"] and ["Romney","Obama"] are the same match, 不应该列出两次。
gong = ["obama", 'trump', 'romney']
min = ['clinton', 'sanders', 'rubio']
all = list()
for i in gong:
for j in min:
all.append([i,j])
# print(all)
list_final = dict((k,v) for k,v in enumerate(all))
print(list_final)
4、Create the dict of 2018, let year2018["Jan"][25]="Thursday"
八、帮助
正如我们宣称的那样:一个优秀的程序员可以通过谷歌搜索你的大多数障碍来适应新技术。在没有互联网的情况下,你仍然可以尝试一些更简单的方法,特别是当你一时想不起语法的时候。
例如,我们会给我们的盟军传递一个加密信息。你的警官告诉你,你可以用"ord"函数。
help(ord)
ord() 函数是 chr() 函数(对于8位的ASCII字符串)或 unichr() 函数(对于Unicode对象)的配对函数,它以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值,或者 Unicode 数值,如果所给的 Unicode 字符超出了你的 Python 定义范围,则会引发一个 TypeError 的异常。
print(ord("x"))
#120
word = "pizza will be ready in 12:30, and no one is watching"
wordseq = [ord(i) for i in list(word)]
print(wordseq)
#[112, 105, 122, 122, 97, 32, 119, 105, 108, 108, 32, 98, 101, 32, 114, 101, 97, 100, 121, 32, 105, 110, 32, 49, 50, 58, 51, 48, 44, 32, 97, 110, 100, 32, 110, 111]
mapping = dict((i,ord(i)) for i in set(word))
print(mapping)
#{'l': 108, 'g': 103, ',': 44, '3': 51, 'n': 110, 'h': 104, 'd': 100, 'w': 119, 'r': 114, 'e': 101, 's': 115, 'p': 112, 'o': 111, '0': 48}
更多练习:https://www.w3resource.com/python-exercises/dictionary/
网友评论