在 Python 中评估词串的辅音/元音组成

jim*_*on 9 python string function pandas jupyter-notebook

我正在尝试将 Python 字符串从其原始形式转换为其元音/辅音组合。

例如 - 'Dog' 变成 'cvc','Bike' 变成 'cvcv'

在 RI 中能够采用以下方法:

   con_vowel <- gsub("[aeiouAEIOU]","V",df$col_name)
   con_vowel <- gsub("[^V]","C",con_vowel)
   df[["composition"]] <- con_vowel
Run Code Online (Sandbox Code Playgroud)

这将评估字符是否为元音,如果为真,则分配字符“V”,然后评估该字符串并将任何不是“V”的内容替换为“C”,然后将结果放入名为“组合”的新列中数据框。

在 Python 中,我在 attempt 中编写了一些代码来复制功能,但它没有返回所需的结果。请参阅下文。

word = 'yoyo'


for i in word.lower():
    if i in "aeiou":
       word = i.replace(i ,'v')
    else: word = i.replace(i ,'c')
print(word)
Run Code Online (Sandbox Code Playgroud)

这里的理论是每个字符都会被评估,如果它不是元音,那么通过推断它必须是一个辅音。但是我得到的结果是:

v
Run Code Online (Sandbox Code Playgroud)

我明白为什么会发生这种情况,但我不清楚如何达到我想要的结果。

请注意,我还需要将结果代码应用于数据框列并从这些结果创建一个新列。

如果你能解释你的答案的工作原理,那将对我有很大帮助。

提前致谢。

ALo*_*llz 5

有一个方法可以解决这个问题;它是translate。传递在翻译表中找不到的值(如' ')既高效又默认。

如果需要,您可以使用string库获取所有辅音。

import pandas as pd
import string

df = pd.DataFrame(['Cat', 'DOG', 'bike', 'APPLE', 'foo bar'], columns=['words'])

vowels = 'aeiouAEIOU'
cons = ''.join(set(string.ascii_letters).difference(set(vowels)))
trans = str.maketrans(vowels+cons, 'v'*len(vowels)+'c'*len(cons))
Run Code Online (Sandbox Code Playgroud)
df['translated'] = df['words'].str.translate(trans)

     words translated
0      Cat        cvc
1      DOG        cvc
2     bike       cvcv
3    APPLE      vcccv
4  foo bar    cvv cvc
Run Code Online (Sandbox Code Playgroud)

它正是为此而设计的,所以速度很快。

在此处输入图片说明

# Supporting code
import perfplot
import pandas as pd
import string

def with_translate(s):
    vowels = 'aeiouAEIOU'
    cons = ''.join(set(string.ascii_letters).difference(set(vowels)))
    trans = str.maketrans(vowels+cons, 'v'*len(vowels)+'c'*len(cons))

    return s.str.translate(trans)


def with_replace(s):
    return s.replace({"[^aeiouAEIOU]":'c', '[aeiouAEIOU]':'v'}, regex=True)


perfplot.show(
    setup=lambda n: pd.Series(np.random.choice(['foo', 'bAR', 'foobar', 'APPLE', 'ThisIsABigWord'], n)), 
    kernels=[
        lambda s: with_translate(s),
        lambda s: with_replace(s),
    ],
    labels=['Translate', 'Replace'],
    n_range=[2 ** k for k in range(19)],
    equality_check=None,  
    xlabel='len(s)'
)
Run Code Online (Sandbox Code Playgroud)


Chr*_*ris 3

使用 string.replace 和一些正则表达式来避免循环

df = pd.DataFrame(['Cat', 'DOG', 'bike'], columns=['words'])
# use string.replace
df['new_word'] = df['words'].str.lower().str.replace(r"[^aeiuo]", 'c').str.replace(r"[aeiou]", 'v')
print(df)

  words new_word
0   Cat      cvc
1   DOG      cvc
2  bike     cvcv
Run Code Online (Sandbox Code Playgroud)