解读python3.7教程(五)—— 集合、字典、条件、遍历技巧

一、 集合

Python还包括集合的数据类型。集合是没有重复元素的无序集合。
大括号或set()函数可用于创建集合。注意:要创建一个空集,您必须使用set(),而不是{};后者创建一个空字典。集合对象还支持数学运算,如并、交、差和对称差。

>>> a = set('abracadabra')
>>> b = set('alacazam')
>>> a                                  # unique letters in a
{'a', 'r', 'b', 'c', 'd'}
>>> a - b                              # letters in a but not in b
{'r', 'd', 'b'}

二、 字典

Python中另一个有用的数据类型是字典(参见映射类型-dict)。字典是由键索引的,键可以是任何不可变的类型;字符串和数字总是可以是键。如果元组仅包含字符串、数字或元组,则可用作键;如果元组直接或间接包含任何可变对象,则不能将其用作键。不能将列表用作键,因为可以使用索引赋值、切片或append()extend()等方法对列表进行适当的修改。

最好将字典看作一组键值对,并要求键是唯一的(在一个字典中)。一对大括号创建一个空字典:{}。

字典的主要操作是用某个键存储一个值,并提取给定的键的值。还可以使用del删除键值对。如果使用已在使用的键进行存储,则会丢失与该键关联的旧值。使用不存在的键提取值是错误的。

在字典上执行list(d)按插入顺序返回字典中使用的所有键的列表(如果希望对其排序,只需使用sorted(d))。若要检查字典中是否有单个键,请使用in关键字。

下面是一个使用字典的小例子:

>>> tel = {'jack': 4098, 'sape': 4139}
>>> tel['guido'] = 4127
>>> tel
{'jack': 4098, 'sape': 4139, 'guido': 4127}
>>> tel['jack']
4098
>>> del tel['sape']
>>> tel['irv'] = 4127
>>> tel
{'jack': 4098, 'guido': 4127, 'irv': 4127}
>>> list(tel)
['jack', 'guido', 'irv']
>>> sorted(tel)
['guido', 'irv', 'jack']
>>> 'guido' in tel
True
>>> 'jack' not in tel
False

dict()构造函数直接从键值对序列构建字典:

>>> dict([('sape', 4139), ('guido', 4127), ('jack', 4098)])
{'sape': 4139, 'guido': 4127, 'jack': 4098}

此外,可以使用字典生成式从任意键和值表达式创建字典:

>>> {x: x**2 for x in (2, 4, 6)}
{2: 4, 4: 16, 6: 36}

当键是简单字符串时,有时更容易使用关键字参数指定对:

>>> dict(sape=4139, guido=4127, jack=4098)
{'sape': 4139, 'guido': 4127, 'jack': 4098}
字典添加

dict.update() 字典里再添加字典的方法

payload = {"user_id": 123}

_payload = {'exp':xxx}

_payload.upadte(payload)

_payload = {'user_id': 123, 'exp': xxx}

三、 遍历技巧

在遍历字典时,可以使用item()方法同时检索键和相应的值。

>>> knights = {'gallahad': 'the pure', 'robin': 'the brave'}
>>> for k, v in knights.items():
...     print(k, v)

gallahad the pure
robin the brave

当循环遍历序列时,可以使用enumerate()函数同时检索位置索引和相应的值。

>>> for i, v in enumerate(['tic', 'tac', 'toe']):
...     print(i, v)
...
0 tic
1 tac
2 toe

要同时循环遍历两个或多个序列,可以将条目与zip()函数配对。

>>> questions = ['name', 'quest', 'favorite color']
>>> answers = ['lancelot', 'the holy grail', 'blue']
>>> for q, a in zip(questions, answers):
...     print('What is your {0}?  It is {1}.'.format(q, a))
...
What is your name?  It is lancelot.
What is your quest?  It is the holy grail.
What is your favorite color?  It is blue.

若要反向遍历序列,首先在前向指定序列,然后调用reverse()函数。

>>> for i in reversed(range(1, 10, 2)):
...     print(i)
...
9
7
5
3
1

若要按排序顺序遍历序列,请使用sorted()函数,该函数返回一个新的排序列表,同时使源保持不变。

>>> basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
>>> for f in sorted(set(basket)):
...     print(f)
...
apple
banana
orange
pear

更多关于条件

whileif语句中使用的条件可以包含任何运算符,而不仅仅是比较。

比较运算符innot in检查某个值是否在序列中出现(不出现)。运算符isis not将比较两个对象是否真的是同一个对象;这只对列表这样的可变对象很重要。所有的比较运算符都有相同的优先级,这比所有的数值运算符都要低。

比较可以被链接起来。例如,a < b == c测试a是否小于b,并且b等于c。

比较可以使用布尔运算符andor组合,比较的结果(或任何其他布尔表达式)可以用not否定。它们的优先级低于比较运算符;它们之间not具有最高优先级,or最低优先级,因此A and not B or C等同于(A and (not B)) or C。一如既往,括号可以用来表示所需的构图。

布尔运算符andor称为短路运算符:它们的参数从左到右进行求值,结果一旦确定就停止计算。例如,如果A和C为true,但B为false,则A and B and C不计算表达式C。当用作通用值而不是布尔值时,短路运算符的返回值是最后求值的参数。

可以将比较或其他布尔表达式的结果赋值给变量。例如:

>>> string1, string2, string3 = '', 'Trondheim', 'Hammer Dance'
>>> non_null = string1 or string2 or string3
>>> non_null
'Trondheim'

⚠️注意:与C不同的是,在Python中,不能在表达式中进行赋值。C程序员可能会抱怨这一点,但它避免了C程序中遇到的一类常见问题:当==有意义时,在表达式中键入=

比较序列和其他类型

序列对象可以与具有相同序列类型的其他对象进行比较。比较使用字典顺序:首先对前两项进行比较,如果它们不同,这将决定比较的结果;如果它们相等,则接下来的两项进行比较,以此类推,直到两个序列都用完为止。如果要比较的两个项目本身是同一类型的序列,则递归地进行字典比较。如果两个序列的所有项比较相等,则认为序列相等。如果一个序列是另一个序列的初始子序列,那么较短的序列就是较小的(较小的)序列。字符串的字典排序使用Unicode代码点号对单个字符进行排序。同一类型序列之间比较的一些例子:

(1, 2, 3)              < (1, 2, 4)
[1, 2, 3]              < [1, 2, 4]
'ABC' < 'C' < 'Pascal' < 'Python'
(1, 2, 3, 4)           < (1, 2, 4)
(1, 2)                 < (1, 2, -1)
(1, 2, 3)             == (1.0, 2.0, 3.0)
(1, 2, ('aa', 'ab'))   < (1, 2, ('abc', 'a'), 4)

请注意,如果对象具有适当的比较方法,则将不同类型的对象用<>进行比较是合法的。例如,混合数字类型根据其数值进行比较,因此0等于0.0,等等。否则,解释器将引发TypeError异常,而不是提供任意排序。

补充说明:

[1]:其他语言可能返回变异的对象,这允许方法链接,例如d->insert("a")->remove("b")->sort();

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值