1、元祖

元祖的特性结合了字符串和列表

元祖是用圆括号括起来的,其中的元素之间用逗号(英文半角)隔开。元祖中的元素是任意类型的python对象(包括以后自定义的对象)

元祖中的元素不可更改,所以修改列表的方法,在元祖中都会失效。

    使用场景:

元祖比列表操作速度快。如果定义了一个值,并且唯一要用他做的是不断的遍历他,那么请使用元祖代替列表。

如果对不需要修改的数据进行"写保护",即该数据是常量,那么此时也要使用元祖。如果必须要改变这些值,则可以转换为列表修改。

元祖可以在字典(又一种对象类型,后面要讲述)中被用作key,但是列表不可以。字典的key必须是不可变的。元祖本身就是不可改变的,而列表是可变的。

   

1.1定义元祖:

tu1 = tuple()
tu2 = (1,)
tu3 = (1,23,3,'python')

>>> a = (3)
>>> type(3)
<class 'int'>  #定义时要注意的

1.2索引和切片,与列表相同

>>> t = (1,'',[123,'abc'],('python','learn'))
>>> t[2]
[123, 'abc']
>>> t[1:]
('', [123, 'abc'], ('python', 'learn'))
>>> t[2][0]
123
>>> t[3][1]
'learn'

1.3转换列表

>>> t = (1,'',[123,'abc'],('python','learn'))
>>> tls = list(t) #转换列表
>>> tls
[1, '', [123, 'abc'], ('python', 'learn')]
>>> t_tuple = tuple(tls) #转换元祖
>>> t_tuple
(1, '', [123, 'abc'], ('python', 'learn'))

1.4方法

dir(tuple)
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'count', 'index']

2、字典(dictionary)

字典中的"键"必须是不可变的数据类型:"值"可以是任意数据类型

2.1创建字典

>>> mydict1 = {}
>>> mydict1
{}
>>> mydict2 = {'name':'zhang','site':'bokeyuan','language':'python'}
>>> mydict2
{'name': 'zhang', 'site': 'bokeyuan', 'language': 'python'} #"键/值对" 前面的叫做(key),后面的叫做值(value)

2.2增加键值对

>>> mydict2['name2'] = "taj"   #追加键值对,内存位置不变,它是可变的
>>> mydict2
{'name': 'zhang', 'site': 'bokeyuan', 'language': 'python', 'name2': 'taj'} #方法2
>>> name = (["first","Google"],["second","Yahoo"])

  >>> type(name)
  <class 'tuple'>
  >>> website = dict(name)

#或
  >>> ad = dict(name = 'tajzhang',ahe = 22)  
  >>> ad
  {'name': 'tajzhang', 'ahe': 22}

#方法3

>>> website = {}.fromkeys(("third","forth"),"facebook")
  >>> website
  {'third': 'facebook', 'forth': 'facebook'}

2.3访问字典的值

>>> mydict2 = {'name':'zhang','site':'bokeyuan','language':'python'}
>>> mydict2["name"]
'zhang'

2.4基本操作

len(d),返回字典(d)中的键值对的数量

d[key],返回字典(d)中的键(key)的值

d[key]=value,将值(value)赋给字典(d)中的键(key).

del d[key],删除字典(d)的键(key)项(将该键值对删除).

key in d,检查字典(d)中是否含有键为key的项

2.5字符串格式化输出

>>> city_code = {"suzhou":"","ttangshan":"","huangzhaou":""}
>>> "Suzhou is a beautiful city, its area code is {suzhou}".format(**city_code)
>>> temp = "<html><head><title>{lang}<title><body><p>My name is {name}.<p><body></head><html>"
>>> my = {"name":"qiwsir","lang":"python"}
>>> temp.format(**my)
'<html><head><title>python<title><body><p>My name is qiwsir.<p><body></head><html>'
#实际应用场景

2.6字典的方法

python重要概念:对象有类型,变量无类型

1)copy,复制,表层id()不同,如果有多层序列类型,则调用相同id

d1 = d.copy()

2)d("key").remove("value")

3)d.clean()  清空字典为空字典

4)del d  删除字典

5)get 通过键取值

>>> d = {'lang':'python'}
>>> d.get('lang')
'python'
>>> d.get('name') #不会报错,较为宽容

6)setdefault

>>> d
{'lang': 'python'}
>>> d.setdefault("lang") #与get类似返回值
'python'
>>> d.setdefault("name","tajzhang") #也可以直接添加键值
'tajzhang'
>>> d
{'lang': 'python', 'name': 'tajzhang'}
>>> d.setdefault("name","zhang2") #修改值不生效
'tajzhang'
>>> d
{'lang': 'python', 'name': 'tajzhang'}
>>> d.setdefault('web') #可添加一个空的键
>>> d
{'lang': 'python', 'name': 'tajzhang', 'web': None}

7)items,keys,values 三种字典扩展类型

>>> dd = {'name':'tajzhang','lang':'python','web':'www.google.com'}
>>> dd_kv = dd.items()
>>> dd_kv
dict_items([('name', 'tajzhang'), ('lang', 'python'), ('web', 'www.google.com')])
>>> type(dd_kv)
<class 'dict_items'>
>>> dd.keys()
dict_keys(['name', 'lang', 'web'])
>>> dd.values()
dict_values(['tajzhang', 'python', 'www.google.com'])

8)pop,popitems

>>> dd
{'name': 'tajzhang', 'lang': 'python', 'web': 'www.google.com'}
>>> dd.pop('name') #指定删除
'tajzhang'
>>> dd.pop('name') #不存在则删除报错
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'name'
>>> dd
{'lang': 'python', 'web': 'www.google.com', 'name': 'zhang2'}
>>> dd.popitem() #与listpop方法类似,不指定值随机删除(因为字典是无序的),当字典为空时会报错
('name', 'zhang2') #返回一个元祖

9)update更新字典内容

>>> d1 = {"lang":'python'}
>>> d2 = {'song':'I dreamed a dream'}
>>> d1.update(d2) #把d2内容更新到d1中,d2不变
>>> d1
{'lang': 'python', 'song': 'I dreamed a dream'}
>>> d2
{'song': 'I dreamed a dream'}
>>> d2
{'song': 'I dreamed a dream'}
>>> d2.update([("name","qiwsir"),("web","itdiffer.com")]) #方法2
>>> d2
{'song': 'I dreamed a dream', 'name': 'qiwsir', 'web': 'itdiffer.com'}

2.7引入深度copy,不管数据多少层都是真复制 不同id()内存地址

>>> x = {'lang':['python','java'],'name':'qiwsir'}
>>> import copy
>>> z = copy.deepcopy(x)
>>> z
{'lang': ['python', 'java'], 'name': 'qiwsir'}
>>> id(x["lang"])
4339599752
>>> id(z["lang"])
4339599880

3、集合

集合特点:有的可变 有的不可变;元素无次序,不可重复。

>>> s1 = set("tajzhang")    #创建集合
>>> s1
{'h', 'j', 'a', 'g', 'z', 't', 'n'}
>>> s2 = set([123,"google","face","book","facebook","book"]) #指定创建
>>> s2
{'google', 'facebook', 123, 'book', 'face'}
>>> type(s2)
<class 'set'>
>>> s3 = {"facebook",123} #直接创建
>>> s3
{123, 'facebook'}
>>> type(s3)
<class 'set'>

3.1 set常用方法

1)add和update

>>> set1 = set()
>>> set1 = {'a','i'}
>>> type(set)
<class 'type'>
>>> set1.add('tajzhang')
>>> set1
{'tajzhang', 'a', 'i'} #插入数据随机位置可见是无序的
set2 = set("python")
>>> set2.add('[1,2,3]') #无法插入列表 转换成字符串格式就可以了?
>>> set2
{'h', '[1,2,3]', 'n', 'tajzhang', 'y', 'o', 'p', 't'}
>>> s1 = set(['a','b'])
>>> s1
{'b', 'a'}
>>> s2 = set(['github','tajzhang'])
>>> s1.update(s2) #追加
>>> s1
{'github', 'tajzhang', 'b', 'a'}
>>> s2
{'github', 'tajzhang'} >>> s2 = set(['github','tajzhang'])
>>> s1.update(s2)
>>> s1
{'github', 'tajzhang', 'b', 'a'}
>>> s2
{'github', 'tajzhang'}
>>> s2
{'github', 'tajzhang'}
>>> s2.update('goo') #文档描述,这个方法的作用原有的集合自身和其他的东西构成的新集合来更新原来的集合。可以理解为:others指的是作为参数的不可变对象,将它和原来的集合组成新的集合,用这个心集合代替原来的集合
>>> s2
{'o', 'github', 'tajzhang', 'g'}
>>> s2.update((2,3))
>>> s2
{2, 3, 'tajzhang', 'o', 'g', 'github'}

2)pop,remove,discard,clear

>>> b_set
{'h', '[1,2,3]', 'n', 'tajzhang', 'y', 'o', 'p', 't'}
>>> b_set.pop()
'h'
>>> b_set.pop()
'[1,2,3]'
>>> b_set.pop() #随机删除一个元素
'n'
>>> b_set
{'tajzhang', 'y', 'o', 'p', 't'}
>>> b_set.pop('y') #指定删除会报错
Traceback (most recent call last):
File "<pyshell#45>", line 1, in <module>
b_set.pop('y')
TypeError: pop() takes no arguments (1 given)
>>> a_set = {"a","tajzhang",'i'}
>>> a_set.remove('i') #删除集合内元素,不在集合内就报错
>>> a_set
{'tajzhang', 'a'}
>>> a_set.remove('w')
Traceback (most recent call last):
File "<pyshell#49>", line 1, in <module>
a_set.remove('w')
KeyError: 'w'
>>> a_set.discard('a') #在集合中就删除,否则不进行任何操作
>>> a_set
{'tajzhang'}
>>> a_set.discard('b') >>> a_set
{'tajzhang'}
>>> a_set.clear() #终极操作清空
>>> a_set
set()
>>> a_set.clear()
>>> bool(a_set)
False

3.2不可变集合

用set()来创建的集合都是可修改,可变的,即unhashable的集合。还有一种集合不能原地修改,这种集合的创建方法是用frozenset(),这种集合就是一个冻结的集合是不能修改的,hashable类型

>>> f_set = frozenset("tajzhang")
>>> f_set
frozenset({'h', 'n', 'z', 'a', 'j', 'g', 't'})
>>> f_set.add("python")
Traceback (most recent call last):
File "<pyshell#61>", line 1, in <module>
f_set.add("python")
AttributeError: 'frozenset' object has no attribute 'add'
>>> dir(f_set)
['__and__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__or__', '__rand__', '__reduce__', '__reduce_ex__', '__repr__', '__ror__', '__rsub__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__xor__', 'copy', 'difference', 'intersection', 'isdisjoint', 'issubset', 'issuperset', 'symmetric_difference', 'union']

3.3集合运算

1)元素与集合的关系

元素与集合只有一种关系,元素要么属于某个集合,要么不属于.

>>> a_set = set("python")
>>> a_set
{'h', 'n', 'y', 'o', 'p', 't'}
>>> "a" in a_set
False
>>> "h" in a_set
True

2)集合与集合关系

假设有两个集合A、B

(1)A是否等于B,即两个集合的元素是否完全一样。

>>> a = set(['q','i','s','r','w'])
>>> b = set(['a','q','i','l','o'])
>>> a == b
False
>>> a != b
True

(2)A是否是B的子集,或者反过来,B是否是A的超集,即A的元素也是B的元素,但是B的元素比A的元素数量多

判断集合A是否是集合B的子集,可以使用A<B或者A.issubset(B),返回True则是子集,否则不是.

>>> a = set("tajzhang")
>>> a
{'h', 'n', 'z', 'a', 'j', 'g', 't'}
>>> c = set("taj")
>>> c
{'t', 'a', 'j'}
>>> c < a
True
>>> c.issubset(a)
True
>>> a.issuperset(c)
True
>>> b = set("zhang222") #当a不是b的子集
>>> b
{'h', 'n', 'z', 'a', '2', 'g'}
>>> a < b
False
>>> a.issubset(b)
Fals

(3)A、B的并集,即A、B的所有元素,如下图:

可以使用符号"|" 是一个半角状态的竖线,也可使用函数A.union(B) 得到的结果就是两个集合的并集.得到的结果是新生成的一个对象,而不是讲AB扩充

>>> a = set("tajzhang")
>>> b = set("zhangquandan")
>>> a
{'h', 'n', 'z', 'a', 'j', 'g', 't'}
>>> b
{'h', 'd', 'n', 'z', 'a', 'g', 'q', 'u'}
>>> c = a|b
>>> c
{'u', 'h', 'd', 'n', 'z', 'a', 'j', 'g', 'q', 't'}
>>> d = a.union(b)
>>> d
{'u', 'h', 'd', 'n', 'z', 'a', 'j', 'g', 'q', 't'}

(4)A、B得到了一个新的结果,但原有集合没有任何改变。

>>> a
{'h', 'n', 'z', 'a', 'j', 'g', 't'}
>>> b
{'h', 'd', 'n', 'z', 'a', 'g', 'q', 'u'}
>>> c = a & b
>>> c
{'h', 'n', 'z', 'a', 'g'}
>>> d = a.intersection(b)
>>> d
{'h', 'n', 'z', 'a', 'g'}

or 与 and  ????

(5)A相对B的差(补),即A相对B不同的部分元素,如下图所示。

>>> a = set("tajzhang")
>>> b = set("zhangquandan")
>>> a - b
{'t', 'j'}
>>> a.difference(b)
{'t', 'j'}
>>> b.difference(a)
{'u', 'd', 'q'}

(6)A、B的对称差集,如图:

>>> a = set("tajzhang")
>>> b = set("zhangquandan")
>>> a.symmetric_difference(b)
{'d', 't', 'j', 'q', 'u'}
>>> b.symmetric_difference(a)
{'d', 'q', 't', 'u', 'j'}

老齐python-基础4(元祖、字典、集合)的更多相关文章

  1. python-列表元祖字典集合

    列表 list = ["a", "b", "c", "d"]元祖 tup = (1, 2, 3, 4, 5 ) 1.元组 ...

  2. python 元祖字典集合

    一.元祖 1.用途:记录多个值,当多个值没有改变的需求,元祖不能修改,但元祖里的数据的数据可以修改. 2.定义方式:在()内用逗号分隔开多个任意值. 思考:如果定义一个只有一个一个值的元祖. # t ...

  3. Python学习笔记---切片 列表 元祖 字典 集合

    列表[1,2,3,2]#[] 元祖(1,2,3,2)#() 字典{1:2,3:2}#{} 集合{1,2,3,2}#{} 1,集合与列表的区别,集合里不能有重复元素 2.字典与集合的区别,都是用花括号表 ...

  4. python基础类型—元祖

    元组  被称为只读列表,即数据可以被查询,但不能被修改,所以,字符串的切片操作同样适用于元组. 例:(1,2,3)("a","b","c") ...

  5. Python基础入门-元祖

    其实,元组合列表的特性和使用几乎差不太多,今天我们重点来看下元组的一些操作和使用. 1.元祖的定义和特点 定义:元组是以小括号包围,元素以逗号分隔,不可变的序列之一. 特点: 1)元祖内的元素不可以增 ...

  6. python基础之元祖、嵌套,for循环、 enumerate、range的试用案例

    元祖又叫做只读列表,可循环查询.可切片,元祖里的直接元素不能更改,但是若里面有嵌套的列表,则可以修改列表里的元素 tu = (1,2,3,'sun',[3,4,5,'cat']) tu[4][3] = ...

  7. python基础之元祖tuple

    元祖是只读列表,不可哈希,可循环查询,可切片*儿子不能改,孙子可更改--元祖里面单个元素不能更改---元祖内列表可更改增:tu1+tu2查:tu1[index] tu1[start_index:end ...

  8. python基础--4 元祖

    #元组,元素不可被修改,不能被增加或者删除 #tuple,有序 tu=(11,22,33,44,55,33) #count 获取指定元素在元祖中出现的次数 print(tu.count(33)) #i ...

  9. 06 元祖 字典 集合set

    元组 定义: ti=() print(ti,type(ti)) 参数:for可以循环的对象(可迭代对象) t2=tuple(") # ('1', '2', '3') <class 't ...

随机推荐

  1. 【hive】在alter修改元数据的时候报错 mismatched input 'xxxxx' expecting KW_EXCHANGE

    目的:修改表某个字段属性 语句: 报错信息 错误原因: 在HiveQL中,alter命令不使用与create或select相同的语义 ; 具体来说,您不能使用“ALTER DATABASE.TABLE ...

  2. windows 2008 server R2 服务器docker安装

    1.安装包选择 windows win10 较新版本,使用 Get Docker for Windows (Stable) 或者 Get Docker for Windows (Edge) 其余使用  ...

  3. 【javascript基础】运算符优先级

    优先级 运算类型 关联性 运算符 1 成员运算符 从左到右 . [] new 从右到左 new 2 函数调用运算符 从左到右 () 3 自增运算符 n/a ++ 自减运算符 n/a -- 4 逻辑非运 ...

  4. 文件目录tree显示,python

    #/usr/bin/python import os def travelTree(currentPath, count=0): if not os.path.exists(currentPath): ...

  5. 前端中CSS属性大全

    css属性 布局常用样式属性: width 设置元素(标签)的宽度,如:width:100px; height 设置元素(标签)的高度,如:height:200px; background 设置元素背 ...

  6. Unicode 和 UTF-8 有何区别? - 引自知乎

    作者:于洋链接:http://www.zhihu.com/question/23374078/answer/69732605来源:知乎著作权归作者所有,转载请联系作者获得授权. 很久很久以前,有一群人 ...

  7. Linux:echo命令详解

    echo命令 用于字符串的输出 格式 echo string 使用echo实现更复杂的输出格式控制 1.显示普通字符串: echo "It is a test" 这里的双引号完全可 ...

  8. js跨域详解

    跨域概念:Cross-origin resource sharing

  9. Shell 命令行实现将一个站点页面全部下载到本地并替换其中链接的脚本

    Shell 命令行实现将一个站点页面全部下载到本地并替换其中链接的脚本 不知道为什么,我总想用 Shell 脚本来实现把一个站点内容给下载下来.但是下载什么站点我确不知道.今天尝试了一下利用 curl ...

  10. 【跟着stackoverflow学Pandas】Select rows from a DataFrame based on values in a column -pandas 筛选

    最近做一个系列博客,跟着stackoverflow学Pandas. 以 pandas作为关键词,在stackoverflow中进行搜索,随后安照 votes 数目进行排序: https://stack ...