TA的每日心情 | 开心 2019-11-20 15:00 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
完全理解 Python 迭代对象、迭代器、生成器之容器 1 Q8 t) b4 {4 h- M( G
5 ]7 O7 T A- G: u- \$ L1 T% B5 Q
在了解Python的数据结构时,容器(container)、可迭代对象(iterable)、迭代器(iterator)、生成器(generator)、列表/集合/字典推导式(list,set,dict comprehension)众多概念参杂在一起,难免让初学者一头雾水。
' c0 U3 Y1 p# a$ i x4 \7 s容器(container). F9 H1 e2 d) x. l, `7 R
容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in, not in关键字判断元素是否包含在容器中。通常这类数据结构把所有的元素存储在内存中(也有一些特例,并不是所有的元素都放在内存,比如迭代器和生成器对象)在Python中,常见的容器对象有:. y: f- {, f/ J' F, S2 X
list, deque, ....( d# `; K7 T+ m* Q$ s# w: B
set, frozensets, ....0 \" ?3 V! a- v# X" P
dict, defaultdict, OrderedDict, Counter, ..../ u* O, n; [- t
tuple, namedtuple, …
W* D0 e2 X! q9 hstr
# t0 ] P+ @9 R7 d* n
3 x) I6 @' A! f9 x容器比较容易理解,因为你就可以把它看作是一个盒子、一栋房子、一个柜子,里面可以塞任何东西。从技术角度来说,当它可以用来询问某个元素是否包含在其中时,那么这个对象就可以认为是一个容器,比如 list,set,tuples都是容器对象:
, H8 ^& a- c Z! \1 `>>> assert 1 in [1, 2, 3] # lists$ S; d2 Y' x. X1 B9 {
>>> assert 4 not in [1, 2, 3]4 y! V3 D+ I2 c" t' S% @
>>> assert 1 in {1, 2, 3} # sets
; ~2 Z* i2 t$ ?' U2 ~5 |4 M5 h; h>>> assert 4 not in {1, 2, 3}# x5 U2 i% i) f4 e+ m0 U& P
>>> assert 1 in (1, 2, 3) # tuples
# z( ]5 g* }) e>>> assert 4 not in (1, 2, 3)
6 O, z0 J' U" W2 z: j) I
$ N) O$ \% Q' u. Z8 d# i! o: O `询问某元素是否在dict中用dict的中key: n# x6 ]( ]; A, z; `7 @( ]
>>> d = {1: 'foo', 2: 'bar', 3: 'qux'}# r) D- L" Q9 v" G
>>> assert 1 in d D+ d0 l; _* x7 @( t. L" Z2 \
>>> assert 'foo' not in d # 'foo' 不是dict中的元素* k& Z0 Q) e( K; |) ^! q& s
: @# Q) w$ c& E+ t/ O9 ?. [询问某substring是否在string中:9 q" X- ?, B: o7 W8 \; L
>>> s = 'foobar'
# k" l$ i: J& D. S" G' \; e>>> assert 'b' in s
' l/ h& w3 a7 u) U2 |+ ?>>> assert 'x' not in s
6 F" @: `3 T9 ^# e>>> assert 'foo' in s0 N; F+ G3 {: d* J* A
' y" i G# \9 t% W" s8 u尽管绝大多数容器都提供了某种方式来获取其中的每一个元素,但这并不是容器本身提供的能力,而是可迭代对象赋予了容器这种能力,当然并不是所有的容器都是可迭代的,比如:Bloom filter,虽然Bloom filter可以用来检测某个元素是否包含在容器中,但是并不能从容器中获取其中的每一个值,因为Bloom filter压根就没把元素存储在容器中,而是通过一个散列函数映射成一个值保存在数组中。 | : {; f+ ?2 v1 S4 i- V3 [' ?0 E( ?& c [
|
|