函数调用将列表从字母字符转换为数字

function call the convert a list is alpha characters to numeric

我正在尝试手动实施 Soundex 算法,这需要将字母文本字符转换为数字文本字符。我定义了以下函数:

import re

def sub_pattern(text):
    sub = [str(i) for i in range(1,4)]
    string = text

    abc = re.compile('[abc]')
    xyz = re.compile('[xyz]')

    encode = [abc, xyz]
    encode_iter = iter(encode)

    alpha_search = re.compile('[a-zA-Z]')

    for i in sub:
        if alpha_search.search(string):
            pattern = next(encode_iter)
            string = pattern.sub(i, string)
        else:
            return(string)

此函数会将 abc 个字符编码为 1,将 xyz 个字符编码为 2。但是,它只适用于单个字符串,我需要将字符串列表传递给该函数。我得到了我想要的结果:

list(map(sub_pattern, ['aab', 'axy', 'bzz']

但我希望能够将列表直接传递给函数。我试过这个但没有成功,因为它只返回列表中的第一个字符串。

def sub_pattern(text_list):
    all_encoded = []
    sub = [str(i) for i in range(1,4)]

    abc = re.compile('[abc]')
    xyz = re.compile('[xyz]')

    encode = [abc, xyz]
    encode_iter = iter(encode)

    alpha_search = re.compile('[a-zA-Z]')

    for string in text_list:
        for i in sub:
            if alpha_search.search(string):
                pattern = next(encode_iter)
                string = pattern.sub(i, string)
            else:
                all_encoded.append(string)

有几点需要注意:

  1. 因为我正在实施 Soundex 算法,所以编码时文本的顺序很重要。我更愿意在其原始索引处更新字符串字符,以避免之后不得不重新组织它。换句话说,您不能对字符串进行任何排序...我创建了迭代器来逐步更新字符串,如果所有字符尚未转换,它只会获取下一个 regex 模式。
  2. 此函数将成为我正在创建的两个自定义 类 的一部分。两者都将调用 __iter__ 方法,以便我可以创建可迭代对象。这就是为什么我使用 iter() 函数来创建可迭代对象的原因,因为如果迭代器自动创建,它将创建一个新实例。

我知道这相对于我正在做的事情来说似乎是一个微不足道的问题,但我被卡住了。

提前谢谢你。

我假设你的例子的问题是,一旦你遍历了迭代器,你就 运行 进入 StopIteration 以获取下一个字符串。

我不确定这是否是您想要的,但我会为每个字符串创建一个新的迭代器,因为您必须能够为每个新项目遍历所有字符串。我也调整了一些可能引起混淆的变量名(string 和 sub)。查看更改评论:

def sub_pattern(text_list):
    all_encoded = []
    digits = [str(i) for i in range(1,4)]

    abc = re.compile('[abc]')
    xyz = re.compile('[xyz]')

    encode = [abc, xyz]
    alpha_search = re.compile('[a-zA-Z]')

    for item in text_list:
        # Create new iterator for each string.
        encode_iter = iter(encode)
        for i in digits:
            if alpha_search.search(item):
                pattern = next(encode_iter)
                item = pattern.sub(i, item)
            else:
                all_encoded.append(item)
                # You likely want appending to end once no more letters can be found.
                break
    # Return encoded texts.
    return all_encoded

测试:

print(sub_pattern(['aab', 'axy', 'bzz'])) # Output: ['111', '122', '122']

递归使用你自己的函数如何?您可以原封不动地保留原件,以备不时之需:

import re

def sub_pattern(text):
    if isinstance(text, str):
        sub = [str(i) for i in range(1,4)]
        string = text

        abc = re.compile('[abc]')
        xyz = re.compile('[xyz]')

        encode = [abc, xyz]
        encode_iter = iter(encode)

        alpha_search = re.compile('[a-zA-Z]')

        for i in sub:
            if alpha_search.search(string):
                pattern = next(encode_iter)
                string = pattern.sub(i, string)
            else:
                return(string)
    else:
        return([sub_pattern(t) for t in text])


print(list(map(sub_pattern, ['aab', 'axy', 'bzz']))) # old version still works
print(sub_pattern(['aab', 'axy', 'bzz'])) # new version yields the same result

如果 reader 不知道 recursively 是什么意思:从其内部调用函数。

  • 这是允许的,因为每个函数调用都会创建自己的 范围,
  • 当您可以通过多次执行一个简单的操作来解决问题,或者无法提前预测需要执行多少次才能达到您的解决方案时,它会很有用,例如当你需要解包嵌套结构时
  • 它是通过选择一个基本情况(解决方案)来定义的,并在所有其他情况下调用该函数,直到达到您的基本情况。