文章目录
53.使用zip()
并行迭代循环
我们可以通过
zip()
函数对多个序列进行并行迭代,zip()
函数在最短序列
“用完”时就会停止。
【操作】测试 zip()并行迭代
# 代码1
names = ("onepis", "lufei", "suolong", "baiz")
ages = (18, 16, 20, 25)
jobs = ("老师", "程序员", "公务员")
# zip并行 代码2
for name, age, job in zip(names, ages, jobs):
print("{0}--{1}--{2}".format(name, age, job))
# 运行结果
onepis--18--老师
lufei--16--程序员
suolong--20--公务员
#######################
# 代码2 普通的不用zip的方法
for i in [1, 2, 3]:
print(i)
# 代码2 正常 方法
for i in range(3):
print("{0}--{1}--{2}".format(names[i], ages[i], jobs[i])) # 只能一个 一个迭代。
# zip 相当于 把 3 个 列表中 的 每一个元素 提出来 放在一起。
# 比如 (name[0]),ages[0],job[0]) 一个一个元组。
# zip 返回的是一个生成器。 可迭代对象。
# ----------------------------
# 关于 zip 的一些 基本测试
# 打包 之后 如何 恢复 原来的列表形式呢?
In [11]: y=[2,4,6,8,10]
In [12]: x=[1,3,5,7,9]
In [13]: z=zip(x,y)
In [14]: list(z)
Out[14]: [(1, 2), (3, 4), (5, 6), (7, 8), (9, 10)]
In [15]: z
Out[15]: <zip at 0x52f27d8>
In [16]: z=zip(x,y)
In [17]: zz=zip(*z)
# 原先 打包的对象 现在 * 解包之后 再次 zip 就 恢复了 原样
In [18]: zz
Out[18]: <zip at 0x5232be8>
In [19]: *zz, # 看这里
# 当然 你也可以 list(zz) 然后 索引 访问 0 1 位置 。 就和原来一模一样了
Out[19]: ((1, 3, 5, 7, 9), (2, 4, 6, 8, 10))
关于一些类型转换
字典与元组相互转换
p = {'a':1, 'b':22, 'c':3}
zip(p.keys(), p.values) # [('a', 1), ('c', 3), ('b', 22)]
ls = [('a', 1), ('c', 3), ('b', 22)]
dict(ls) # {'a':1, 'b':22, 'c':3}
元组与列表互相转换
# list转换为tuple:
list1=[1,2,3]
tupl=tuple(list1)
-----
# tuple转换为list:
list(tupl)
列表和字典之间互相转换
使用 zip
函数 打包列表。
names = ("onepis", "lufei", "suolong", "baiz")
ages = (18, 16, 20, 25)
jobs = ("老师", "程序员", "公务员")
dict(zip(names,jobs))
运行效果
In [29]: names = ("onepis", "lufei", "suolong", "baiz")
...: ages = (18, 16, 20, 25)
...: jobs = ("老师", "程序员", "公务员")
...: dict(zip(names,jobs)) # dict 只接受 两个。 如果多个参数 会 报错 ValueError
Out[29]: {'onepis': '老师', 'lufei': '程序员', 'suolong': '公务员'}
嵌套的列表或者元组
In [32]: dict([["onepis","programmer"],["lufei","worker"]])
Out[32]: {'onepis': 'programmer', 'lufei': 'worker'}
字典转为列表
dic={'onepis': '老师', 'lufei': '程序员', 'suolong': '公务员'}
# 将字典的key 转换为 列表。
lst=list(dic)
print(lst) # ['onepis', 'lufei', 'suolong']
lst2=list(dic.values())
print(lst2) # 将值转换为 列表
# ['老师', '程序员', '公务员']
# 还有就是 item
In [36]: [*dic.items()] # 利用前面我讲过的 * 解包 也可以的
Out[36]: [('onepis', '老师'), ('lufei', '程序员'), ('suolong', '公务员')]
# 记住 我前面 讲过的几个常用 方法
# keys values items
# get 这都是关于字典 常用的。
字符串转换字典
json
模块
# 对于 是 这种 json 写法的 字符串
# 可以直接 使用 json 模块 的 loads 来转换
# 但是 json 字符串里面 不能使用 单引号。
# 容易报错。
In [43]: import json
In [44]: s = '{"name": "onpis"}'
In [45]: s
Out[45]: '{"name": "onpis"}'
In [46]: json.loads(s)
Out[46]: {'name': 'onpis'}
使用 eval
函数
eval
本质上是 运行 字符串的表达式
这两种方法都有局限性。
In [44]: s = '{"name": "onpis"}'
In [47]: eval(s)
Out[47]: {'name': 'onpis'}
In [48]: s
Out[48]: '{"name": "onpis"}'
# 但是eval 不安全 所以我们还有一个 安全的 eval
# 当然 安全与否 是看我们 用户能接触到的 绝对不能使用 eval 函数。
In [39]: from ast import literal_eval
In [40]: x="2+3"
In [41]: y='{"name":"onepis"}'
In [42]: z="c=3" # 这种会报错。语法错误。
# eval 和 literal_eval 都不允许 赋值
In [43]: literal_eval(x)
Out[43]: 5
In [44]: literal_eval(y)
Out[44]: {'name': 'onepis'}
In [44]: literal_eval(y)
Out[44]: {'name': 'onepis'}
In [45]: literal_eval(z)
Traceback (most recent call last):
File "<unknown>", line 1
c=3
^
SyntaxError: invalid syntax
# 那我们怎么办 , 不允许 赋值
# 还有一个函数叫做 exec
In [56]: exec("{'onepis':22}") # 仅仅只是执行 返回的是None
# 所以我们需要用一个变量取接收他
In [57]: exec("aa={'onepis':22}") # 可以赋值
In [58]: aa
Out[58]: {'onepis': 22}
直接用字符串 创建字典就可以了。
单引号字符转双引号
利用 json
字符串 不支持 双引号的 特性 进行转换
默认打印出来的 都是 单引号 字符。
In [221]: import faker
In [222]: fake=faker.Faker(['zh_CN'])
In [223]: colors=[fake.color() for i in range(30)]
In [224]: colors[0:3]
Out[224]: ['#fce2bf', '#f7be6f', '#6c39a3']
In [225]: import json
In [226]: json.dumps(colors)
Out[226]: '["#fce2bf", "#f7be6f", "#6c39a3", "#74e0db", "#84ea75", "#bf161f", "#6775ce", "#edd47b", "#0fc10f", "#33bf7b", "#5902cc", "#e8be17", "#dd119d", "#e2e253", "#db91f2", "#f5fca6", "#67ce37", "#67f7a3", "#d8bf2f", "#96f2d2", "#5fdef4", "#56dd85", "#efee8d", "#bc1436", "#d3d648", "#116d6d", "#e27c3d", "#f24b93", "#e57b86", "#ef2004"]'