对于所有的集合,无论是有序集合(str,tuple,list)还是无序集合(set,dict), 我们都可以通过 for 循环来遍历该集合,这种遍历我们称为迭代(Iteration)。
对于所有集合的迭代,带入的都是集合中的成员(dict 带入的是键),在 Python 中,迭代是通过 for...in
来完成的。
我们知道 for...in
遍历有序集合的时,
带入的是集合中的单个成员,这里的单个成员变量可以是任何类型的,比如成员本身也可以是个集合。
mylist = [1, "hello", [1, 2], (1,), {"a": 1}] for item in mylist: print(item)
用 for...in
遍历无序集合 set 时,带入的是 set 中的单个成员,
但要注意 set 的内存结构和 dict 一样都是按 hash 表存储的,和我们创建时候给的顺序不一定一致。
myset = set(["a", "b", (1, 2)]) for item in myset: print(item)
用 for...in
遍历无序集合 dict 时,带入的并不是 dict 的单个成员变量,而是 dict 单个成员变量的 key。
mydict = {"a": 1, "b": 2, "c": 3} for item in mydict: print(item)
用 for...in
直接遍历 dict 的 keys 函数,values 函数和 items 函数。
students_dict = {"name": "ruhua", "age": 18} for student in students_dict.keys(): print(student) # 带入的是键 for student in students_dict.values(): print(student) # 带入的是值 for student in students_dict.items(): print(student) # 带入的是成员
如何判断一个对象是可迭代对象呢?方法是通过 collections 模块的 Iterable 类型判断。
from collections.abc import Iterable myint = 2 myfloat = 2.2 mybool = True mynone = None mystr = "hello" mylist = [1, 2, 3] mytuple = (1, 2, 3) myset = set([1, 2, 3]) mydict = {"a": 1, "b": 2, "c": 3} print(isinstance(myint, Iterable)) # False print(isinstance(myfloat, Iterable)) # False print(isinstance(mybool, Iterable)) # False print(isinstance(mynone, Iterable)) # False print(isinstance(mystr, Iterable)) # True print(isinstance(mylist, Iterable)) # True print(isinstance(mytuple, Iterable)) # True print(isinstance(myset, Iterable)) # True print(isinstance(mydict, Iterable)) # True
如果要对集合实现类似 c++,java 等那样的下标循环怎么办呢,Python
内置的 enumerate 函数可以把一个集合变成索引-成员对,这样就可以在
for...in
中同时迭代索引和成员(dict 是键)本身。
mylist = [1, 2, 3] mydict = {"a": 1, "b": 2, "c": 3} for index, item in enumerate(mylist): print(index, item) for index, item in enumerate(mydict): print(index, item)
用 for...in
遍历集合时,我们得到的是集合的单个成员(dict
是 key),如果集合的单个成员也是一个集合,
我们可以用多个变量来带入该成员的成员,注意带入的变量个数必须和该成员每个成员的个数一致。
mylist = [(1, 2), (3, 4), (5, 6)] mydict = {(1, 2): 1, (3, 4): 2, (5, 6): 3} for itemone, itemtwo in mylist: print(itemone, itemtwo) for index, item in mydict: print(itemone, itemtwo) for itemone, itemtwo, itemthree in mylist: # 错误 print(itemone, itemtwo)
注意如果想用多个变量带入集合的成员,必须确保集合的成员是个集合,且集合成员的成员个数 是一样的。
mylist = [(1, 2), (3, 4), (5, 6, 7)] for itemone, itemtwo in mylist: # 错误 pass
dict 遍历注意事项。
会使用 Iterable 和 enumerate。
著名公司(某易)笔试题:请使用迭代查找一个 list 中最小和最大值,并返回一个 dict, 返回值的样式为:{"min": min, "max": max}。
mylist = [4, 9, 1, 8] # 在下面完成代码
你是大神老鸟吗,看了你录制的视频,很厉害
def findmax(mylist): max = mylist[0] # 先假定第一个元素是最大值 maxdict = {"max": max} for item in mylist: if item > maxdict["max"]: maxdict["max"] = item return maxdict mylist = [4, 8, 9, 3] print(findmax(mylist))
非常感谢,刚刚学习到生成器
写得好
厉害了我的哥,终于弄明白啥是迭代了
mylist = [4, 9, 1, 8,10,30,100];
num = { "max":'', "min":'' };
for item in mylist: pass _max = num['max']; _min = num['min'];
print(num);