Оцените согласную / гласную композицию строки слова в Python - PullRequest
5 голосов
/ 04 мая 2020

Я пытаюсь преобразовать строку Python из ее первоначальной формы в комбинацию гласных / согласных.

Например, 'Dog' становится 'cv c', а 'Bike' становится 'cvcv '

В RI удалось применить следующий метод:

   con_vowel <- gsub("[aeiouAEIOU]","V",df$col_name)
   con_vowel <- gsub("[^V]","C",con_vowel)
   df[["composition"]] <- con_vowel

Это позволит оценить, является ли символ гласным, и если true присвоить символу' V ', то оценить эту строку и заменить что-нибудь, что не было 'V' с 'C', затем поместите результаты в новый столбец с названием 'составная часть' внутри фрейма данных.

В Python я написал некоторый код в попытке повторить функциональность, но она не возвращает желаемый результат. Пожалуйста, см. Ниже.

word = 'yoyo'


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

Теория здесь такова, что каждый символ будет оцениваться, и, если это не гласный звук, то при вычитании он должен быть согласным. Однако результат, который я получаю:

v

Я не понимаю, почему это происходит, но я не совсем понимаю, как достичь желаемого результата.

Обратите внимание, что мне также нужны результирующий код, который будет применен к столбцу фрейма данных и создаст новый столбец из этих результатов.

Если бы вы могли объяснить, как работает ваш ответ, мне бы очень помогло.

Заранее спасибо.

Ответы [ 8 ]

3 голосов
/ 04 мая 2020

Вы можете использовать replace с regex=True:

words = pd.Series(['This', 'is', 'an', 'Example'])
words.str.lower().replace({"[^aeiou]":'c', '[aeiou]':'v'}, regex=True)

Выход:

0       ccvc
1         vc
2         vc
3    vcvcccv
dtype: object
2 голосов
/ 04 мая 2020

Есть способ для этого; это 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))

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

Это сделано именно для этого, поэтому это быстро.

enter image description here

# 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)'
)
2 голосов
/ 04 мая 2020

используйте string.replace с некоторым регулярным выражением, чтобы избежать l oop

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
1 голос
/ 04 мая 2020

Вы, вероятно, уже поняли это, но в вашем решении для l oop определяет для каждой буквы, является ли это гласной или нет, но не сохраняет результат. Вот почему он дает вам только результат последней итерации (v, поскольку 'o' является гласным).

Вы можете попробовать создать новую пустую строку и затем добавить к ней:

word='yoyo'
new_word=''

for i in word.lower():
    if i in "aeiou":
        new_word+='v'
    else:
        new_word+='c'

print(new_word)
1 голос
/ 04 мая 2020
vowels = set("aeiou")
word = "Dog"

new_word = ""
for char in word.lower():
    new_word += "v" if char in vowels else "c"

print(new_word)

Обратите внимание, что для ускорения теста членства используется set для гласных. Кроме этого, мы пересекаем пониженную версию word и добавляем требуемый символ (v или c) во вновь сформированную строку через троицу.

1 голос
/ 04 мая 2020

Попробуйте так:

word = 'yoyo'

for i in word.lower():
    if i in "aeiou":
       word=word.replace(i ,'v')
    else:
        word=word.replace(i ,'c')
print(word)
1 голос
/ 04 мая 2020

Попробуйте это:

word = 'yoyo'
word = list(word)

for i in range(len(word)):
    if word[i] in 'aeiou':
        word[i] = 'v'
    else:
        word[i] = 'c'

print(''.join(word))
1 голос
/ 04 мая 2020

В Python строки являются неизменяемыми.
Почему?

Есть несколько преимуществ.

Одним из них является производительность: знание, что строка неизменна, означает, что мы можем выделить пространство для него во время создания, а требования к хранению являются фиксированными и неизменными. Это также одна из причин различия между кортежами и списками.

Другое преимущество состоит в том, что строки в Python считаются «элементарными» как числа. Никакая активность не изменит значение 8 на что-либо еще, и в Python никакая активность не изменит строку «восемь» на что-либо еще.

Чтобы уменьшить путаницу и потенциал ошибки предпочтительнее создать новую строку вместо изменения оригинала. Я также добавил is_alpha (), чтобы понять, имеем ли мы дело с буквой алфавита или числом / символом, и действовать соответствующим образом.

Вот мой код:

word = 'yoyo'

def vocals_consonants_transformation(word):
    modified_word = ""
    for i in range(0, len(word)):
        if word[i].isalpha():
            if word[i] in "aeiou":
                modified_word += 'v'
            else:
                modified_word += 'c'
        else:
            modified_word += word[i]
    return modified_word


print(vocals_consonants_transformation(word))

Вывод
cvcv

Источник:
https://docs.python.org/3/faq/design.html#why -are- python -строки-неизменяемые

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...