函数调用将列表从字母字符转换为数字
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)
有几点需要注意:
- 因为我正在实施 Soundex 算法,所以编码时文本的顺序很重要。我更愿意在其原始索引处更新字符串字符,以避免之后不得不重新组织它。换句话说,您不能对字符串进行任何排序...我创建了迭代器来逐步更新字符串,如果所有字符尚未转换,它只会获取下一个
regex
模式。
- 此函数将成为我正在创建的两个自定义 类 的一部分。两者都将调用
__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 是什么意思:从其内部调用函数。
- 这是允许的,因为每个函数调用都会创建自己的
范围,
- 当您可以通过多次执行一个简单的操作来解决问题,或者无法提前预测需要执行多少次才能达到您的解决方案时,它会很有用,例如当你需要解包嵌套结构时
- 它是通过选择一个基本情况(解决方案)来定义的,并在所有其他情况下调用该函数,直到达到您的基本情况。
我正在尝试手动实施 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)
有几点需要注意:
- 因为我正在实施 Soundex 算法,所以编码时文本的顺序很重要。我更愿意在其原始索引处更新字符串字符,以避免之后不得不重新组织它。换句话说,您不能对字符串进行任何排序...我创建了迭代器来逐步更新字符串,如果所有字符尚未转换,它只会获取下一个
regex
模式。 - 此函数将成为我正在创建的两个自定义 类 的一部分。两者都将调用
__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 是什么意思:从其内部调用函数。
- 这是允许的,因为每个函数调用都会创建自己的 范围,
- 当您可以通过多次执行一个简单的操作来解决问题,或者无法提前预测需要执行多少次才能达到您的解决方案时,它会很有用,例如当你需要解包嵌套结构时
- 它是通过选择一个基本情况(解决方案)来定义的,并在所有其他情况下调用该函数,直到达到您的基本情况。