我正在尝试找到一种方法来对 Python 数组中的字符进行操作

I am trying to find a way to act on characters in an array in Python

提问人:Usergyt 提问时间:11/8/2023 更新时间:11/8/2023 访问量:72

问:

我对编码和 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,但没有任何改变。这太烦人了

python 数组字符串 循环 for 循环

评论

0赞 Ignatius Reilly 11/8/2023
你期望做什么?df["word"] == df["word"]
0赞 JNevill 11/8/2023
此外,您可以遍历分配给变量的单词中的每个字符。 只会抛出一个错误,因为单词加 1 中的字符不起作用。不过,它从来没有机会抛出错误,因为这没有意义。单词的单个字符永远不会等于列表。我认为一些非常基本的调试步骤是有序的。ji[j+1]j == Ḱ
0赞 pho 11/8/2023
ericlippert.com/2014/03/05/how-to-debug-small-programs

答:

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

  1. 为了通过索引引用列表元素,您需要列出/string /。这将同时返回索引和字符。enumerate()iword

  2. 若要查看某个项目是否在列表中,请使用运算符,而不是 。IN==

  3. str.replace()方法采用两个字符串参数,而不是两个列表;此外,这很危险,因为如果您有多个需要替换的角色实例,即使它们不在 .W

  4. 条件/测试是一个很好的小技巧,可以查看两个列表是否包含至少一个共同的元素。由于我们想查看上一个/下一个字符是否在列表中,因此它可以作为快速测试,而无需 .bool()Wor

至于使用 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
谢谢。直到现在才确定如何回应。工作非常灵活。