numpy 通过if else语句加快列表追加的过程

nxowjjhe  于 2023-04-21  发布在  其他
关注(0)|答案(1)|浏览(104)

我有一个列表,其中包含的字符串是“A”,“B”和“C”的组合。
例如:

abc_list = ["AB", "AC", "AB", "BC", "BB", ...]

现在我想创建一个新的列表,用一个简单的规则将每个元素再次转换为“A”、“B”和“C”。
规则如下:
如果元素是“AA”、“AB”或“BA”,则新的字符串元素必须变为“A”。如果元素是“BB”、“AC”或“CA”,则新的字符串元素必须变为“B”。如果元素是“CC”、“CB”或“BC”,则新的字符串元素必须变为“C”。
因此,新列表变为:

new_abc_list = ["A", "B", "A", "C", "B", ...]

我现在是按照下面的方法来做的,但是我有一种感觉,它可以做得更有效率。

new_abc_list = []
for element in abc_list :
    if element == "AA":
        new_abc_list .append("A")
    elif element == "AB":
        new_abc_list .append("A")
    elif element == "BA":
        new_abc_list .append("A")
    elif element == "CB":
        new_abc_list .append("C")
    elif element == "CC":
        new_abc_list .append("C")
    elif element == "BC":
        new_abc_list .append("C")
    else:
        new_abc_list .append("B")
return new_abc_list

什么是更有效的方法来做到这一点?

vvppvyoh

vvppvyoh1#

对于字典和列表理解来说,这看起来是一个很好的工作:

mapper = {"AA": "A", "AB": "A", "BA": "A", "CB": "C", "CC": "C", "BC": "C"}

abc_list = ["AB", "AC", "AB", "BC", "BB"]

# find the value from key, default to 'B' if not found
new_abc_list = [mapper.get(x, 'B') for x in abc_list]

输出:

['A', 'B', 'A', 'C', 'B']

复杂度是O(n),因为字典搜索是O(1)。相反,你的原始代码必须测试所有的值,直到它为循环中的每个项找到匹配。

计时

在500k项(abc_list = ["AB", "AC", "AB", "BC", "BB"] * 100_000)上进行6次测试:

# dictionary with list comprehension
27.8 ms ± 1.94 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

# dictionary with for loop and append
56.4 ms ± 12.5 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

# loop with tests
84.8 ms ± 11.7 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

最差情况:不匹配任何测试的500k项(abc_list = ['ZZ']*500_000):

# dictionary with list comprehension
35.1 ms ± 4.08 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

# dictionary with for loop and append
48.2 ms ± 2.62 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

# loop with tests
124 ms ± 20.7 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

相关问题