提问人:Usergyt 提问时间:11/8/2023 更新时间:11/8/2023 访问量:72
我正在尝试找到一种方法来对 Python 数组中的字符进行操作
I am trying to find a way to act on characters in an array in Python
问:
我对编码和 Python 非常陌生。我正在尝试更改数组的字符串元素中的字符,条件是它们与另一个字符的邻接性。
这些字符根据共享的音质分组到数组中(这是一个语言学问题)。因此,我试图做的是通过字符串数组来迭代声音变化。
这是事情的要点:
W = ["w","u"]
Ḱ = ["ḱ","ǵ","ǵʰ"]
K = ["k","g","gʰ"]
for i in df["word"]:
for j in i:
if j == Ḱ and (i[j+1] == W or i[j-1] == W):
i=i.replace(Ḱ, K, regex=True)
df["word"] == df["word"]
我本来以为像 ǵwe 这样的东西会变成 gwe 或 uǵhi 会变成 ughi,但没有任何改变。这太烦人了
答:
0赞
Suraj Shourie
11/8/2023
#1
如果要将一个列表中的所有字母替换为另一个列表中的相应字母,则需要以不同的方式构建代码。
根据我对你的问题的了解,这样的事情会起作用:
old_words = ['ǵwe', 'uǵʰi'] # init
new_words = []
for word in old_words:
for i, w in enumerate(Ḱ):
word = word.replace(w, K[i]) # replace for each word in Ḱ with corresponding word in K
new_words.append(word)
new_words
输出:
['gwe', 'ugʰi']
0赞
JNevill
11/8/2023
#2
为了尽可能忠实于您原来的预期逻辑,修复众多问题的重写将如下所示:
W = ["w","u"]
Ḱ = ["ḱ","ǵ","ǵʰ"]
K = ["k","g","gʰ"]
i='ǵwe'
for idx, j in enumerate(word):
prev_char = word[idx - 1] if idx > 0 else None
next_char = word[idx + 1] if idx < len(i)-1 else None
if (j in Ḱ) and bool(set(W) & {prev_char, next_char}):
word[idx]=K[Ḱ.index(j)]
print(''.join(word))
这求解了变量 中保存的单个单词。一些值得注意的变化:i
为了通过索引引用列表元素,您需要列出/string /。这将同时返回索引和字符。
enumerate()
i
word
若要查看某个项目是否在列表中,请使用运算符,而不是 。
IN
==
str.replace()
方法采用两个字符串参数,而不是两个列表;此外,这很危险,因为如果您有多个需要替换的角色实例,即使它们不在 .W
条件/测试是一个很好的小技巧,可以查看两个列表是否包含至少一个共同的元素。由于我们想查看上一个/下一个字符是否在列表中,因此它可以作为快速测试,而无需 .
bool()
W
or
至于使用 DataFrame,请不要迭代。相反,您希望在将上述代码扔到函数中后使用。apply()
import pandas as pd
def replace_chars(i):
W = ["w","u"]
Ḱ = ["ḱ","ǵ","ǵʰ"]
K = ["k","g","gʰ"]
word = list(i)
for idx, j in enumerate(word):
prev_char = word[idx - 1] if idx > 0 else None
next_char = word[idx + 1] if idx < len(i)-1 else None
if (j in Ḱ) and bool(set(W) & {prev_char, next_char}):
word[idx]=K[Ḱ.index(j)]
return ''.join(word)
df = pd.DataFrame({"word":['ǵwe', 'uǵʰi', 'test2']})
df["word2"] = df["word"].apply(lambda x: replace_chars(x))
display(df)
使用字典进行“k”个声音交换可能是有意义的,这应该有助于简化你的代码,并为添加更多要交换的声音提供一条前进的途径(例如,嵌套字典结构将是下一个逻辑步骤)。这看起来像这样:
def replace_chars(i):
W = ["w","u"]
k_sounds = {"ḱ":"k","ǵ":"g","ǵʰ":"gʰ"}
word = list(i)
for idx, j in enumerate(word):
prev_char = word[idx - 1] if idx > 0 else None
next_char = word[idx + 1] if idx < len(word)-1 else None
if j in k_sounds.keys() and bool(set(W) & {prev_char, next_char}):
word[idx]=k_sounds[j]
return ''.join(word)
评论
0赞
Usergyt
11/18/2023
谢谢。直到现在才确定如何回应。工作非常灵活。
评论
df["word"] == df["word"]
j
i[j+1]
j == Ḱ