Python3 列表、字典、元组、集合解析(推导式)各种写法

https://blog.csdn.net/weixin_41611054/article/details/113870870

因为解析式的高效和简洁,所以这里记录下列表、字典、元组、集合解析的各种写法。

列表解析

通过[]list()进行列表解析。

单层for循环

  1. data = [1, 2, 3, 4, 5, 6, 7]
  2. a = [i for i in data]
  3. # 或者:a = list(i for i in data)
  4. # 执行结果:[1, 2, 3, 4, 5, 6, 7]
  5. # 执行顺序:
  6. a = []
  7. for i in data:
  8.     a.append(i)

单层for循环 + if判断(if写在后面)

  1. data = [1, 2, 3, 4, 5, 6, 7]
  2. b = [i for i in data if i != 1]
  3. # 或者:b = list(i for i in data if i != 1)
  4. # 执行结果:[2, 3, 4, 5, 6, 7]
  5. # 执行顺序:
  6. b = []
  7. for i in data:
  8.     if i != 1:
  9.         b.append(i)

单层for循环 + if判断 + else(if写在前面)

  1. data = [1, 2, 3, 4, 5, 6, 7]
  2. c = [i if i != 1 else 0 for i in data]
  3. # 或者:c = list(i if i != 1 else 0 for i in data)
  4. # 执行结果:[0, 2, 3, 4, 5, 6, 7]
  5. # 执行顺序:
  6. c = []
  7. for i in data:
  8.     if i != 1:
  9.         c.append(i)
  10.     else:
  11.         c.append(0)

多层for循环

  1. data = [1, 2, 3, 4, 5, 6, 7]
  2. d = [i * j for i in data for j in range(3)]
  3. # 或者:d = list(i * j for i in data for j in range(3))
  4. # 执行结果:[0, 1, 2, 0, 2, 4, 0, 3, 6, 0, 4, 8, 0, 5, 10, 0, 6, 12, 0, 7, 14]
  5. # 执行顺序:
  6. d = []
  7. for i in data:
  8.     for j in range(3):
  9.         d.append(i * j)

多层for循环 + if判断

  1. data = [1, 2, 3, 4, 5, 6, 7]
  2. e = [i * j for i in data for j in range(3) if i == j]
  3. # 或者:e = list(i * j for i in data for j in range(3) if i == j)
  4. # 执行结果:[1, 4]
  5. # 执行顺序:
  6. e = []
  7. for i in data:
  8.     for j in range(3):
  9.         if i == j:
  10.             e.append(i * j)

多层for循环 + 多个if判断(多个if可用and连接)

  1. data = [1, 2, 3, 4, 5, 6, 7]
  2. f = [i * j for i in data for j in range(3) if i > 1 if j > 1]
  3. # 或者:f = list(i * j for i in data for j in range(3) if i > 1 if j > 1)
  4. # 执行结果:[4, 6, 8, 10, 12, 14]
  5. # 执行顺序:
  6. f = []
  7. for i in data:
  8.     for j in range(3):
  9.         if i > 1:
  10.             if j > 1:
  11.                 f.append(i * j)
  12. f = [i * j for i in data for j in range(3) if i > 1 and j > 1]
  13. # 或者:f = list(i * j for i in data for j in range(3) if i > 1 and j > 1)
  14. # 执行结果:[4, 6, 8, 10, 12, 14]
  15. # 执行顺序:
  16. f = []
  17. for i in data:
  18.     for j in range(3):
  19.         if i > 1 and j > 1:
  20.                 f.append(i * j)

字典解析

通过{}dict()进行字典解析。

单层for循环

  1. data = {'a': 0, 'b': 1, 'c': 2, 'd': 3}
  2. a = {v: k for k, v in data.items()}
  3. # 或者:a = dict((v, k) for k, v in data.items())
  4. # 执行结果:{0: 'a', 1: 'b', 2: 'c', 3: 'd'}
  5. # 执行顺序:
  6. a = {}
  7. for k, v in data.items():
  8.     a.update({v: k})

单层for循环 + if判断(if写在后面)

  1. data = {'a': 0, 'b': 1, 'c': 2, 'd': 3}
  2. b = {k: v for k, v in data.items() if v > 1}
  3. # 或者:b = dict((k, v) for k, v in data.items() if v > 1)
  4. # 执行结果:{'c': 2, 'd': 3}
  5. # 执行顺序:
  6. b = {}
  7. for k, v in data.items():
  8.     if v > 1:
  9.         b.update({k: v})

单层for循环 + if判断 + else(if写在前面)

  1. data = {'a': 0, 'b': 1, 'c': 2, 'd': 3}
  2. c = {k: v if v > 1 else None for k, v in data.items()}
  3. # 执行结果:{'a': None, 'b': None, 'c': 2, 'd': 3}
  4. # 执行顺序:
  5. c = {}
  6. for k, v in data.items():
  7.     if v > 1:
  8.         c.update({k: v})
  9.     else:
  10.         c.update({k: None})

多层for循环

  1. data = {'a': {'num0': 0}, 'b': {'num1': 1}, 'c': {'num2': 2}, 'd': {'num3': 3}}
  2. d = {k1: v2 for k1, v1 in data.items() for k2, v2 in v1.items()}
  3. # 或者:d = dict((k1, v2) for k1, v1 in data.items() for k2, v2 in v1.items())
  4. # 执行结果:{'a': 0, 'b': 1, 'c': 2, 'd': 3}
  5. # 执行顺序:
  6. d = {}
  7. for k1, v1 in data.items():
  8.     for k2, v2 in v1.items():
  9.         d.update({k1: v2})

多层for循环 + if判断

  1. data = {'a': {'num0': 0}, 'b': {'num1': 1}, 'c': {'num2': 2}, 'd': {'num3': 3}}
  2. e = {k1: v2 for k1, v1 in data.items() for k2, v2 in v1.items() if k2 != 'num0'}
  3. # 或者:d = dict((k1, v2) for k1, v1 in data.items() for k2, v2 in v1.items() if k2 != 'num0')
  4. # 执行结果:{'b': 1, 'c': 2, 'd': 3}
  5. # 执行顺序:
  6. e = {}
  7. for k1, v1 in data.items():
  8.     for k2, v2 in v1.items():
  9.         if k2 != 'num0':
  10.             e.update({k1: v2})

多层for循环 + 多个if判断(多个if可用and连接)

  1. data = {'a': {'num0': 0}, 'b': {'num1': 1}, 'c': {'num2': 2}, 'd': {'num3': 3}}
  2. f = {k1: v2 for k1, v1 in data.items() for k2, v2 in v1.items() if k2 != 'num0' if v2 > 1}
  3. # 或者:f = dict((k1, v2) for k1, v1 in data.items() for k2, v2 in v1.items() if k2 != 'num0' if v2 > 1)
  4. # 执行结果:{'c': 2, 'd': 3}
  5. # 执行顺序:
  6. f = {}
  7. for k1, v1 in data.items():
  8.     for k2, v2 in v1.items():
  9.         if k2 != 'num0':
  10.             if v2 > 1:
  11.                 f.update({k1: v2})
  12. f = {k1: v2 for k1, v1 in data.items() for k2, v2 in v1.items() if k2 != 'num0' and v2 > 1}
  13. # 或者:f = dict((k1, v2) for k1, v1 in data.items() for k2, v2 in v1.items() if k2 != 'num0' and v2 > 1)
  14. # 执行结果:{'c': 2, 'd': 3}
  15. # 执行顺序:
  16. f = {}
  17. for k1, v1 in data.items():
  18.     for k2, v2 in v1.items():
  19.         if k2 != 'num0' and v2 > 1:
  20.                 f.update({k1: v2})

元组解析

通过()tuple()进行元组解析,前者返回的是元组,后者返回的是个生成器。生成器占用的内存较小,可通过循环读取。写法和列表解析相似。

  1. data = [1, 2, 3, 4, 5, 6, 7]
  2. ## 通过()解析
  3. a = (i for i in data)
  4. # 执行结果:<generator object <genexpr> at 0x7f1e24bf1fc0>
  5. ## 单层for循环
  6. a = tuple(i for i in data)
  7. # 执行结果:(1, 2, 3, 4, 5, 6, 7)
  8. ## 单层for循环 + if判断(if写在后面)
  9. b = tuple(i for i in data if i != 1)
  10. # 执行结果:(2, 3, 4, 5, 6, 7)
  11. ## 单层for循环 + if判断 + else(if写在前面)
  12. c = tuple(i if i != 1 else 0 for i in data)
  13. # 执行结果:(0, 2, 3, 4, 5, 6, 7)
  14. ## 多层for循环
  15. d = tuple(i * j for i in data for j in range(3))
  16. # 执行结果:(0, 1, 2, 0, 2, 4, 0, 3, 6, 0, 4, 8, 0, 5, 10, 0, 6, 12, 0, 7, 14)
  17. ## 多层for循环 + if判断
  18. e = tuple(i * j for i in data for j in range(3) if i == j)
  19. # 执行结果:(1, 4)
  20. ## 多层for循环 + 多个if判断(多个if可用and连接)
  21. f = tuple(i * j for i in data for j in range(3) if i > 1 if j > 1)
  22. f = tuple(i * j for i in data for j in range(3) if i > 1 and j > 1)
  23. # 执行结果:(4, 6, 8, 10, 12, 14)

集合解析

通过{}set()进行集合解析。集合中没有重复元素。写法和列表解析相似。

  1. data = [1, 2, 3, 4, 5, 6, 7, 7, 1]
  2. ## 通过{}解析
  3. a = {i for i in data}
  4. # 执行结果:{1, 2, 3, 4, 5, 6, 7}
  5. ## 单层for循环
  6. a = set(i for i in data)
  7. # 执行结果:{1, 2, 3, 4, 5, 6, 7}
  8. ## 单层for循环 + if判断(if写在后面)
  9. b = set(i for i in data if i != 1)
  10. # 执行结果:{2, 3, 4, 5, 6, 7}
  11. ## 单层for循环 + if判断 + else(if写在前面)
  12. c = set(i if i != 1 else 0 for i in data)
  13. # 执行结果:{0, 2, 3, 4, 5, 6, 7}
  14. ## 多层for循环
  15. d = set(i * j for i in data for j in range(3))
  16. # 执行结果:{0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14}
  17. ## 多层for循环 + if判断
  18. e = set(i * j for i in data for j in range(3) if i == j)
  19. # 执行结果:{1, 4}
  20. ## 多层for循环 + 多个if判断(多个if可用and连接)
  21. f = set(i * j for i in data for j in range(3) if i > 1 if j > 1)
  22. f = set(i * j for i in data for j in range(3) if i > 1 and j > 1)
  23. # 执行结果:{4, 6, 8, 10, 12, 14}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值