Various ways of writing Python3 lists, dictionaries, tuples, and set analysis (derivation)

Because of the high efficiency and conciseness of the analytical formula, various ways of writing lists, dictionaries, tuples, and set parsing are recorded here.

list comprehension

List comprehension via [] or list() .

single layer for loop

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)

Single-layer for loop + if judgment (if written in the back)

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)

Single-layer for loop + if judgment + else (if written in front)

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)

multi-level for loop

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)

Multi-layer for loop + if judgment

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)

Multi-layer for loop + multiple if judgments (multiple ifs can be connected with 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)

dictionary analysis

Dictionary comprehension via {} or dict() .

single layer for loop

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})

Single-layer for loop + if judgment (if written in the back)

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})

Single-layer for loop + if judgment + else (if written in front)

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})

multi-level for loop

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})

Multi-layer for loop + if judgment

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})

Multi-layer for loop + multiple if judgments (multiple ifs can be connected with 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 parsing

Tuple parsing is performed by () or tuple() , the former returns a tuple, and the latter returns a generator. Generators have a small memory footprint and can be read through a loop. The writing method is similar to list comprehension.

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)

collection analysis

Collection parsing via {} or set() . There are no duplicate elements in the set. The writing method is similar to list comprehension.

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}

 

Guess you like

Origin blog.csdn.net/weixin_41611054/article/details/113870870