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

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

列表解析

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

单层for循环

data = [1, 2, 3, 4, 5, 6, 7]

a = [i for i in data]
# 或者:a = list(i for i in data)

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

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

data = [1, 2, 3, 4, 5, 6, 7]

b = [i for i in data if i != 1]
# 或者:b = list(i for i in data if i != 1)

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

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

data = [1, 2, 3, 4, 5, 6, 7]

c = [i if i != 1 else 0 for i in data]
# 或者:c = list(i if i != 1 else 0 for i in data)

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

多层for循环

data = [1, 2, 3, 4, 5, 6, 7]

d = [i * j for i in data for j in range(3)]
# 或者:d = list(i * j for i in data for j in range(3))

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

多层for循环 + if判断

data = [1, 2, 3, 4, 5, 6, 7]

e = [i * j for i in data for j in range(3) if i == j]
# 或者:e = list(i * j for i in data for j in range(3) if i == j)

# 执行结果:[1, 4]
# 执行顺序:
e = []
for i in data:
    for j in range(3):
        if i == j:
            e.append(i * j)

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

data = [1, 2, 3, 4, 5, 6, 7]

f = [i * j for i in data for j in range(3) if i > 1 if j > 1]
# 或者:f = list(i * j for i in data for j in range(3) if i > 1 if j > 1)

# 执行结果:[4, 6, 8, 10, 12, 14]
# 执行顺序:
f = []
for i in data:
    for j in range(3):
        if i > 1:
            if j > 1:
                f.append(i * j)

f = [i * j for i in data for j in range(3) if i > 1 and j > 1]
# 或者:f = list(i * j for i in data for j in range(3) if i > 1 and j > 1)

# 执行结果:[4, 6, 8, 10, 12, 14]
# 执行顺序:
f = []
for i in data:
    for j in range(3):
        if i > 1 and j > 1:
                f.append(i * j)

字典解析

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

单层for循环

data = {'a': 0, 'b': 1, 'c': 2, 'd': 3}

a = {v: k for k, v in data.items()}
# 或者:a = dict((v, k) for k, v in data.items())

# 执行结果:{0: 'a', 1: 'b', 2: 'c', 3: 'd'}
# 执行顺序:
a = {}
for k, v in data.items():
    a.update({v: k})

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

扫描二维码关注公众号,回复: 15370038 查看本文章
data = {'a': 0, 'b': 1, 'c': 2, 'd': 3}

b = {k: v for k, v in data.items() if v > 1}
# 或者:b = dict((k, v) for k, v in data.items() if v > 1)

# 执行结果:{'c': 2, 'd': 3}
# 执行顺序:
b = {}
for k, v in data.items():
    if v > 1:
        b.update({k: v})

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

data = {'a': 0, 'b': 1, 'c': 2, 'd': 3}

c = {k: v if v > 1 else None for k, v in data.items()}

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

多层for循环

data = {'a': {'num0': 0}, 'b': {'num1': 1}, 'c': {'num2': 2}, 'd': {'num3': 3}}

d = {k1: v2 for k1, v1 in data.items() for k2, v2 in v1.items()}
# 或者:d = dict((k1, v2) for k1, v1 in data.items() for k2, v2 in v1.items())

# 执行结果:{'a': 0, 'b': 1, 'c': 2, 'd': 3}
# 执行顺序:
d = {}
for k1, v1 in data.items():
    for k2, v2 in v1.items():
        d.update({k1: v2})

多层for循环 + if判断

data = {'a': {'num0': 0}, 'b': {'num1': 1}, 'c': {'num2': 2}, 'd': {'num3': 3}}

e = {k1: v2 for k1, v1 in data.items() for k2, v2 in v1.items() if k2 != 'num0'}
# 或者:d = dict((k1, v2) for k1, v1 in data.items() for k2, v2 in v1.items() if k2 != 'num0')

# 执行结果:{'b': 1, 'c': 2, 'd': 3}
# 执行顺序:
e = {}
for k1, v1 in data.items():
    for k2, v2 in v1.items():
        if k2 != 'num0':
            e.update({k1: v2})

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

data = {'a': {'num0': 0}, 'b': {'num1': 1}, 'c': {'num2': 2}, 'd': {'num3': 3}}

f = {k1: v2 for k1, v1 in data.items() for k2, v2 in v1.items() if k2 != 'num0' if v2 > 1}
# 或者:f = dict((k1, v2) for k1, v1 in data.items() for k2, v2 in v1.items() if k2 != 'num0' if v2 > 1)

# 执行结果:{'c': 2, 'd': 3}
# 执行顺序:
f = {}
for k1, v1 in data.items():
    for k2, v2 in v1.items():
        if k2 != 'num0':
            if v2 > 1:
                f.update({k1: v2})

f = {k1: v2 for k1, v1 in data.items() for k2, v2 in v1.items() if k2 != 'num0' and v2 > 1}
# 或者:f = dict((k1, v2) for k1, v1 in data.items() for k2, v2 in v1.items() if k2 != 'num0' and v2 > 1)

# 执行结果:{'c': 2, 'd': 3}
# 执行顺序:
f = {}
for k1, v1 in data.items():
    for k2, v2 in v1.items():
        if k2 != 'num0' and v2 > 1:
                f.update({k1: v2})

元组解析

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

data = [1, 2, 3, 4, 5, 6, 7]

## 通过()解析
a = (i for i in data)
# 执行结果:<generator object <genexpr> at 0x7f1e24bf1fc0>

## 单层for循环
a = tuple(i for i in data)
# 执行结果:(1, 2, 3, 4, 5, 6, 7)

## 单层for循环 + if判断(if写在后面)
b = tuple(i for i in data if i != 1)
# 执行结果:(2, 3, 4, 5, 6, 7)

## 单层for循环 + if判断 + else(if写在前面)
c = tuple(i if i != 1 else 0 for i in data)
# 执行结果:(0, 2, 3, 4, 5, 6, 7)

## 多层for循环
d = tuple(i * j for i in data for j in range(3))
# 执行结果:(0, 1, 2, 0, 2, 4, 0, 3, 6, 0, 4, 8, 0, 5, 10, 0, 6, 12, 0, 7, 14)

## 多层for循环 + if判断
e = tuple(i * j for i in data for j in range(3) if i == j)
# 执行结果:(1, 4)

## 多层for循环 + 多个if判断(多个if可用and连接)
f = tuple(i * j for i in data for j in range(3) if i > 1 if j > 1)
f = tuple(i * j for i in data for j in range(3) if i > 1 and j > 1)
# 执行结果:(4, 6, 8, 10, 12, 14)

集合解析

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

data = [1, 2, 3, 4, 5, 6, 7, 7, 1]

## 通过{}解析
a = {i for i in data}
# 执行结果:{1, 2, 3, 4, 5, 6, 7}

## 单层for循环
a = set(i for i in data)
# 执行结果:{1, 2, 3, 4, 5, 6, 7}

## 单层for循环 + if判断(if写在后面)
b = set(i for i in data if i != 1)
# 执行结果:{2, 3, 4, 5, 6, 7}

## 单层for循环 + if判断 + else(if写在前面)
c = set(i if i != 1 else 0 for i in data)
# 执行结果:{0, 2, 3, 4, 5, 6, 7}

## 多层for循环
d = set(i * j for i in data for j in range(3))
# 执行结果:{0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14}

## 多层for循环 + if判断
e = set(i * j for i in data for j in range(3) if i == j)
# 执行结果:{1, 4}

## 多层for循环 + 多个if判断(多个if可用and连接)
f = set(i * j for i in data for j in range(3) if i > 1 if j > 1)
f = set(i * j for i in data for j in range(3) if i > 1 and j > 1)
# 执行结果:{4, 6, 8, 10, 12, 14}

 

猜你喜欢

转载自blog.csdn.net/weixin_41611054/article/details/113870870