TA的每日心情 | 开心 2019-11-20 15:00 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
完全理解 Python 迭代对象、迭代器、生成器之容器 5 I( _7 b4 n) q
8 c! Z* h: M! e( ]+ S2 T在了解Python的数据结构时,容器(container)、可迭代对象(iterable)、迭代器(iterator)、生成器(generator)、列表/集合/字典推导式(list,set,dict comprehension)众多概念参杂在一起,难免让初学者一头雾水。
8 _7 N0 I; ^2 V1 n F: T4 u# l* e容器(container)8 t( ]) s% k V2 u D
容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in, not in关键字判断元素是否包含在容器中。通常这类数据结构把所有的元素存储在内存中(也有一些特例,并不是所有的元素都放在内存,比如迭代器和生成器对象)在Python中,常见的容器对象有:! p i7 Z1 f( S
list, deque, ....
6 Z6 j$ z6 ~( X8 Uset, frozensets, ....
. v3 g4 g& e+ r- o& D O- zdict, defaultdict, OrderedDict, Counter, ....
3 r; ^6 [' Y. v* _tuple, namedtuple, …$ j$ f# Y, m: a. ^# E# w
str
- `9 C. N1 D+ g6 L5 h: e# g, {7 x% @9 i, U- Y
容器比较容易理解,因为你就可以把它看作是一个盒子、一栋房子、一个柜子,里面可以塞任何东西。从技术角度来说,当它可以用来询问某个元素是否包含在其中时,那么这个对象就可以认为是一个容器,比如 list,set,tuples都是容器对象:0 P+ ]& |/ [8 ~# {% w
>>> assert 1 in [1, 2, 3] # lists
3 v8 V4 f1 ~; p3 F>>> assert 4 not in [1, 2, 3]
! w! u. J# l; `! z$ F6 N>>> assert 1 in {1, 2, 3} # sets
# f# b4 n/ D8 H. a3 f>>> assert 4 not in {1, 2, 3}- h7 L) A& v9 g- O( G7 j1 d& Y
>>> assert 1 in (1, 2, 3) # tuples
3 I' M; L2 H+ S' M _+ ?' s+ o>>> assert 4 not in (1, 2, 3); J, [7 X" p1 `
1 U: [& q$ C, T) U( I, f+ H3 D) `& |
询问某元素是否在dict中用dict的中key:
4 N% \# R3 n! F>>> d = {1: 'foo', 2: 'bar', 3: 'qux'}
+ V/ T3 D% g. Z$ L* v A" H3 T( [( C>>> assert 1 in d
6 h( B z4 T$ {8 O>>> assert 'foo' not in d # 'foo' 不是dict中的元素
+ `- } i$ t2 ]. J! F+ c; x! l( I* H- Z6 M
询问某substring是否在string中:
# x1 B" v+ m. q+ I5 Y$ A, V>>> s = 'foobar'
6 v7 J" u- Y$ A>>> assert 'b' in s8 b$ g& A3 g9 m L
>>> assert 'x' not in s
$ S/ J, J# P# `( ?% O' ]>>> assert 'foo' in s
% Z4 {0 _# t% C" p# X! d( s) A- Q5 @; \$ a2 ~2 K9 J% Y- W, G
尽管绝大多数容器都提供了某种方式来获取其中的每一个元素,但这并不是容器本身提供的能力,而是可迭代对象赋予了容器这种能力,当然并不是所有的容器都是可迭代的,比如:Bloom filter,虽然Bloom filter可以用来检测某个元素是否包含在容器中,但是并不能从容器中获取其中的每一个值,因为Bloom filter压根就没把元素存储在容器中,而是通过一个散列函数映射成一个值保存在数组中。 | / ~" U: Z. H# J0 I
|
|