#!/usr/bin/env python
# coding: utf-8
# Code:https://github.com/lotapp/BaseCode
#
# **多图旧版**:https://www.cnblogs.com/dunitian/p/9156097.html
#
# **在线预览**:http://github.lesschina.com/python/base/pop/3.list_tuple_dict_set.html
#
# 今天说说`List、Tuple、Dict、Set`。POP部分还有一些如Func、IO(也可以放OOP部分说)然后就说说面向对象吧。
#
# 先吐槽一下:Python面向对象真心需要规范,不然太容易走火入魔了 -_-!!! 汗,下次再说。。。
#
# ## 1.Python列表相关
#
# ### 1.1.列表定义、遍历
#
# `info_list=[]` #空列表
#
# `infos_list=["C#","JavaScript"]`
#
# 遍历和之前一样,`for` 或者 `while` 都可以
#
# for扩展:https://www.cnblogs.com/dunitian/p/9103673.html#forelse
# In[1]:
# 定义一个列表,列表虽然可以存不同类型,一般我们把相同类型的值存列表里面
infos_list=["C#","JavaScript"]#定一个空列表 list=[]
# In[2]:
# for遍历
for item in infos_list:
print(item)
# In[3]:
# while遍历
i=0
while i
infos_list.extend(infos_list2)
print(infos_list)
# In[8]:
#可以查看extend方法描述
help(infos_list.extend)
# ### 1.3.列表删除
#
# `infos_list.pop()` # 删除最后一个
#
# `infos_list.pop(0)` # 删除指定索引,不存在就报错
# In[9]:
# 删除
# pop()删除最后一个元素,返回删掉的元素
infos_list.pop()
# In[10]:
infos_list #查看一下列表
# In[11]:
# 删除
# pop(index) 删除指定下标元素,返回删掉的元素
infos_list.pop(0)
# In[12]:
infos_list #查看一下列表
# In[13]:
# 索引不存在就报错
infos_list.pop(10)
# `infos_list.remove("张三")` # `remove("")`删除指定元素,不存在就报错
#
# `del infos_list[1]` # 删除指定下标元素,不存在就报错
#
# `del infos_list` # 删除集合(集合再访问就不存在了)不同于C#给集合赋null
#
# 关于`del`的删除后面还会说,这个和`linux`里面的`ln`引用删除类似
# In[14]:
# remove("")删除指定元素
infos_list.remove("张三") #没有返回值
print(infos_list)
# In[15]:
infos_list.remove("dnt") # 不存在就报错
# In[16]:
# del xxx[index] 删除指定下标元素
del infos_list[1] #没有返回值
print(infos_list)
# In[17]:
del infos_list[10] #不存在就报错
# In[18]:
del infos_list # 删除集合(集合再访问就不存在了)
# In[19]:
infos_list # 集合再访问就不存在了
# ### 1.4.列表修改
#
# Python修改:(**只能通过索引修改**)
#
# `infos_list2[1]="PHP"` # 只有下标修改一种方式,**不存在则异常**
#
# 想按值修改需要**先查下标再修改** eg:
#
# `infos_list2.index("张三")`
#
# `infos_list2[0]="GO"`
#
# `infos_list2.index("dnt")` # **不存在则异常**
# In[20]:
# 修改 xxx[index]=xx
# 注意:一般不推荐在for循环里面修改
infos_list2 #查看list2列表
# In[21]:
infos_list2[1]="PHP" #只有下标修改一种方式
print(infos_list2)
# In[22]:
infos_list2[3]="GO" #不存在则异常
# In[23]:
# 想按值修改需要先查下标再修改
infos_list2.index("张三")
infos_list2[0]="GO"
print(infos_list2)
# In[24]:
infos_list2.index("dnt")#不存在则异常
# In[25]:
# 知识面拓展: https://www.zhihu.com/question/49098374
# 为什么python中不建议在for循环中修改列表?
# 由于在遍历的过程中,删除了其中一个元素,导致后面的元素整体前移,导致有个元素成了漏网之鱼。
# 同样的,在遍历过程中,使用插入操作,也会导致类似的错误。这也就是问题里说的无法“跟踪”元素。
# 如果使用while,则可以在面对这样情况的时候灵活应对。
# ### 1.5.查询系列
#
# `in, not in, index, count`
# In[26]:
# 查询 in, not in, index, count
names_list=["张三","李四","王二麻子"]
# In[27]:
# 张三在列表中执行操作
if "张三" in names_list:
names_list.remove("张三")
print(names_list)
# In[28]:
# 查看"大舅子"不在列表中执行操作
if "大舅子" not in names_list:
names_list.append("大舅子")
print(names_list)
# In[29]:
# 查询王二麻子的索引
print(names_list.index("王二麻子"))
# In[30]:
# 统计
print(names_list.count("大舅子"))
print(names_list.count("逆天"))
# ### 1.6.排序系列
#
# `num_list.reverse() `# 倒序
#
# `num_list.sort()` # 从小到大排序
#
# `num_list.sort(reverse=True)` # 从大到小
# In[31]:
# 排序专用
num_list=[1,3,5,88,7]
# In[32]:
# 倒序 reverse 逆置
num_list.reverse()
print(num_list)
# In[33]:
# 从小到大排序
num_list.sort()
print(num_list)
# In[34]:
# 从大到小
num_list.sort(reverse=True)
print(num_list)
# ### 1.7.列表切片
#
# 列表的切片操作很有用,主要跟数据相关,实际应用中和dict(后面会讲)联合使用
#
# python切片语法:`[start_index:end_index:step]` (**end_index取不到**)
#
# 先说说 `range`
# In[35]:
# range扩展~创建一个整数列表
# range(5)生成的序列是从0开始小于5的整数~[0,5)
range_list=list(range(5))
print(range_list)
# In[36]:
# range(1,5)生成的序列是从1开始小于5的整数~[1,5)
range_list=list(range(1,5))
print(range_list)
# In[37]:
# 列表的切片操作很有用,主要跟数据相关,实际应用中和dict(后面会讲)联合使用
# python切片语法:[start_index:end_index:step] (end_index取不到)
top100=list(range(1,101)) #[1,101) => 1~100
print(top100)
# In[38]:
# 取前10个元素
top100[:10] #等价于:top100[0:10]
# In[39]:
# 取最后10个元素
top100[-10:]
# In[40]:
# 前11~20(eg:第二页)
top100[10:20]
# In[41]:
# 取80~90(eg:倒数第二页)
top100[-20:-10]
# In[42]:
# 前20个数,每两个取一个(eg:隔行换样式)
top100[:20:2]
# In[43]:
# 所有数每10个取一个(eg:test的时候十里挑一)
top100[::10]
# ### 1.8.Python列表相关的扩展
#
# **列表虽然可以存不同类型,一般我们把相同类型的值存列表里面,不同类型存字典里(key,value)**
#
# **列表嵌套**,获取用下标的方式:`num_list[5][1]`
# In[44]:
# #列表嵌套(列表也是可以嵌套的)
num_list2=[33,44,22]
num_list.append(num_list2)
print(num_list)
# In[45]:
# 输出
print(num_list[5])
print(num_list[5][1]) #嵌套列表获取值的方式
# In[46]:
# 引入Null==>None
a=[1,2,3,4]
b=[5,6]
a=a.append(b)#a.append(b)没有返回值
print(a)#None
# **补充概念**,`str` 和 `tuple` 也可以用切片操作哦~
#
# str上次说了,这次说下Tuple(后面会继续说Tuple,先了解下吧)
# In[47]:
# 取前两个 返回元组
(1,2,3,4,5)[:2]
# ### 1.9.列表生成式
#
# **列表生成式**是Python内置用来 **创建list的生成式**
#
# eg:要生成 list `[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]`
#
# 传统方法是通过循环来实现,比如:
# In[48]:
i=1
my_list=[]
while(i<11):
my_list.append(i)
i+=1
# In[49]:
my_list
# 有了列表生成式就方便了 `list(range(1, 11))`(之前说列表切片的时候稍微引入了一下range)
#
# 另一种写法:`[x for x in range(1,11)]` 来看看案例:
# In[50]:
list(range(1, 11))
# In[51]:
[x for x in range(1,11)]
# 可能有人会问,第一种写法不是挺好的嘛,为什么要用第二种复杂写法?
#
# 看看下面案例你就知道它的强大了(能简写就简单)
#
# 现在有了`range`生成就更方便了,可如果我们需要 **1~10的平方列表**呢?`[1^2,2^2,....10^2]'
# In[52]:
my_list=[]
for i in range(1,11):
my_list.append(i*i)
i+=1
print(my_list)
# 但是循环太繁琐,而列表生成式则可以用一行语句代替循环生成上面的list
#
# `[x * x for x in range(1, 11)]` 你可以这样理解==>**就是我们平时的for循环嘛,前面的参数是返回值罢了**
# In[53]:
[x*x for x in range(1,11)]
# In[54]:
# 把一个list中所有的字符串变成小写
my_list = ['Hello', 'World', 'I', 'Love', 'You']
# In[55]:
[x.lower() for x in my_list]
# 列表生成式的强大仅限于此嘛?No~
#
# **for循环后面还可以加上if判断** `[x for x in range(1, 11) if x % 2 == 0]`
#
# **多重for循环嵌套** `[x + y for x in 'ABC' for y in 'AB']`
# In[56]:
# 1~10之间的偶数
[x for x in range(1, 11) if x % 2 == 0]
# In[57]:
# 数学里面的全排列
[x + y for x in 'ABC' for y in 'AB']
# 其实你可以把他看成
# ```py
# list1=[]
# for x in range(1,5):
# for y in range(1,4):
# list1.append((x,y))
# ```
# In[58]:
# 数学里面的坐标轴(元组马上就讲了,你可以看看)
[(x,y) for x in range(1,5) for y in range(1,4)]
# In[59]:
# (x,y,z)
[(x,y,z) for x in range(1,5) for y in range(1,4) for z in range(1,3)]
# ## 2.CSharp列表相关
#
# ### 2.1.列表定义、遍历
#
# `var infos_list = new List