TA的每日心情 | 开心 2019-11-20 15:00 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
完全理解 Python 迭代对象、迭代器、生成器之容器 % ?+ O, {3 w7 M3 `3 _
; S- p6 e8 Z; o, @: j8 v
在了解Python的数据结构时,容器(container)、可迭代对象(iterable)、迭代器(iterator)、生成器(generator)、列表/集合/字典推导式(list,set,dict comprehension)众多概念参杂在一起,难免让初学者一头雾水。
* C8 t7 H7 F1 Y$ u容器(container)
( e" E+ n$ Y; p9 L4 K0 t* B容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in, not in关键字判断元素是否包含在容器中。通常这类数据结构把所有的元素存储在内存中(也有一些特例,并不是所有的元素都放在内存,比如迭代器和生成器对象)在Python中,常见的容器对象有:; Z' O- n. k ^3 w
list, deque, ....$ V' N' z7 m( @& b8 m
set, frozensets, ....3 [3 k# B: {9 V% ~! w0 K
dict, defaultdict, OrderedDict, Counter, ....
) f6 n) ]0 _) m; y% Ftuple, namedtuple, …
0 b# j1 A( l& _$ s( Z, R4 ^str
5 {& U, v3 {' H0 S3 W
3 q' o3 h2 }# k2 U2 c, S. `* A容器比较容易理解,因为你就可以把它看作是一个盒子、一栋房子、一个柜子,里面可以塞任何东西。从技术角度来说,当它可以用来询问某个元素是否包含在其中时,那么这个对象就可以认为是一个容器,比如 list,set,tuples都是容器对象:
7 L' \+ ?4 d, n" s/ w>>> assert 1 in [1, 2, 3] # lists
* e2 l5 @' _. o' w h>>> assert 4 not in [1, 2, 3]' i6 G! t3 |! h7 a' h9 J! ^& b
>>> assert 1 in {1, 2, 3} # sets0 c0 u4 h) l& `$ I; e/ L4 Y+ {
>>> assert 4 not in {1, 2, 3}
* J N. v" R% T. g4 t5 o: o6 M>>> assert 1 in (1, 2, 3) # tuples
: j- H# ~' ^1 j4 H: ~>>> assert 4 not in (1, 2, 3)7 Q, @: E) Q$ x
5 O8 T% e/ G4 @% e( b8 j x2 W w
询问某元素是否在dict中用dict的中key:
# o, {3 X0 k7 e2 V0 `>>> d = {1: 'foo', 2: 'bar', 3: 'qux'}9 N/ D. K+ b/ v+ g) p7 v
>>> assert 1 in d
1 e4 K' g3 I+ h5 {# H z>>> assert 'foo' not in d # 'foo' 不是dict中的元素) P; Q, L5 r' \
6 V G0 W/ Y! e; ~( w- u/ r% [询问某substring是否在string中:
5 b4 G1 _& x4 ?>>> s = 'foobar'
0 g' B7 e' c$ P" C2 G0 F>>> assert 'b' in s
7 d2 @6 a: j/ X' h>>> assert 'x' not in s/ S& w) s3 q, {% S' I; w
>>> assert 'foo' in s
4 h6 K; o% V- E9 w7 S g$ ^- I5 l# u
尽管绝大多数容器都提供了某种方式来获取其中的每一个元素,但这并不是容器本身提供的能力,而是可迭代对象赋予了容器这种能力,当然并不是所有的容器都是可迭代的,比如:Bloom filter,虽然Bloom filter可以用来检测某个元素是否包含在容器中,但是并不能从容器中获取其中的每一个值,因为Bloom filter压根就没把元素存储在容器中,而是通过一个散列函数映射成一个值保存在数组中。 |
- f8 y# g# d7 w, X( |- ] |
|