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. Nginx禁止域名恶意解析

    今天打开网站发现访客人数突增啊,不对啊,小站哪来这么多的访问量呢?打开百度统计,看到有其他的域名解析到我的IP,心中很不爽啊.遂搜索之,才有了此篇文章. 打开Nginx配置文件/etc/nginx/s ...

  2. 005PHP基础知识——数据类型(二)

    <?php /** * 布尔型判断一种状态是否成立. * 布尔型 TRUE FALSE * 为布尔假型的类型: * 1. FALSE * 2. 0 * 3. 0.0 * 4. 空字符串为假 * ...

  3. EPANET中的typedef使用

    struct  Floatlist  /* Element of list of floats */{   double  value;   struct  Floatlist *next;};typ ...

  4. 【网络编程】inet_addr、inet_ntoa、inet_aton、inet_ntop和inet_pton区分

    先上一张图 1.把ip地址转化为用于网络传输的二进制数值 int inet_aton(const char *cp, struct in_addr *inp); inet_aton() 转换网络主机地 ...

  5. halocn/C++ (第一篇)

        在使用C++编写halcon之前,确定自己有较好的C++基础,并熟悉一套开发平台如VC   Programmers_guide.pdf chapter7中有关于creating Aplicat ...

  6. 【LeetCode 28_字符串_匹配】Implement strStr()

    解法一:Brute-force int strStr(string haystack, string needle) { int m = haystack.size(); int n = needle ...

  7. C++中几个值得分析的小问题(2)

    下面有3个小问题,作为C++ Beginner你一定要知道错在哪里了. 1.派生类到基类的引用或指针转换一定“完美”存在? 一般情况,你很可能会认为:派生类对象的引用或指针转换为基类对象的引用或指针是 ...

  8. easyui(1)

    使用Easyui1.引入必要的文件 1).jquery核心库 2).easyui核心库 3).easyui中文提示信息 4).自己开发的js文件 5).easyui核心UI文件css 6).easyu ...

  9. SpringInAction--条件化的Bean

    学习了profile bean之后,发现有的时候bean还是有根据环境来选择的余地的,那么假设我们希望某个bean只有当另外某个特定的bean也声明了之后才会创建.我们还可能要求只有某个特定的环境变量 ...

  10. Android学习笔记①——安卓工具的基本安装

    安卓已经出来很长时间了,网上的教程也有很多,怕以后忘记,就把网上大牛们的分享的知识自己在学习一下,也记录一下,如果能帮到别人,那是更好不过的! 鉴于现在的IDE工具来说,IDEA已经占据了java的半 ...