字符串列表的Pig-Latin转换只产生第一个字符串Python 3

字符串列表的Pig-Latin转换只产生第一个字符串Python 3,python,python-3.x,Python,Python 3.x,我想知道你是否能帮我找到代码中的错误。我正在从文本文件中读取一个句子,将其转换为Pig拉丁语,并将结果称为“string” 有人能解释为什么这只转换句子中的第一个单词吗?我以为for循环会通过句子中的所有单词 __ 编辑2016年3月12日下午2:46 非常感谢大家的帮助。我采用了最接近Saleem的方法,由于设置了一个名为“answer”的空字符串,所以我希望输出为一个字符串 当第一个字符+“ay”被放置在其他字符的新行上时,我希望转换的文本字符串中的最后一个单词出现了问题。有人知道为什么会这

我想知道你是否能帮我找到代码中的错误。我正在从文本文件中读取一个句子,将其转换为Pig拉丁语,并将结果称为“string”

有人能解释为什么这只转换句子中的第一个单词吗?我以为for循环会通过句子中的所有单词

__ 编辑2016年3月12日下午2:46

非常感谢大家的帮助。我采用了最接近Saleem的方法,由于设置了一个名为“answer”的空字符串,所以我希望输出为一个字符串

当第一个字符+“ay”被放置在其他字符的新行上时,我希望转换的文本字符串中的最后一个单词出现了问题。有人知道为什么会这样吗

words = string.split(" ") 
answer = "" 
for word in words: 
    if word[0] in vowels:
        answer += word + "way" + " "
    else:
        position = 0
        for char in word:
            if char not in vowels:
                position += 1
            else:
                break
        answer += word[position:] + word[:position] + "ay" + " "      
return answer
对于字符串“最后一个单词出现在新行上” 它产生如下结果:

astLay ordway omescay Ownay ine外大街。
lay

for循环将遍历每个单词,但您可以使用
return…
将其缩短如果您去参加一个聚会,然后带着一盒饼干回来,您需要返回才能带着另一盒回来。函数也是如此:要返回多个值,需要多次调用函数。您可以使用
yield
,并在调用它时使用
list(myfunction(string))
,但也可以创建一个列表以在末尾返回:

words = string.split() 
vowels = ['a', 'e', 'i', 'o', 'u', 'y']
answer = []
for word in words:
    position = 0
    while word[position] not in vowels:
        position += 1

    if word[position] in vowels:
        answer.append(word[position:] + word[:position] + "ay")
return answer

你真的回来了。也可以缩短到

def is_vowel(char):
    return char in ['a', 'e', 'i', 'o', 'u', 'y']

def piglatin(sentence):
    words = sentence.split()
    piglatin_words = []
    for word in words:
        index = [is_vowel(ch) for ch in word].index(True)
        piglatin_words.append(word[index:] + word[:index] + 'ay')
    return ' '.join(piglatin_words)

print piglatin('this is my original sentance')

您将在过程的末尾调用return,该过程只包含第一个单词。即使没有回报,你也可以实现你的目标。e、 g.用所需结果填充列表,并在末尾返回列表

下面是使用yield关键字返回迭代器的另一种方法。请参阅下面的代码片段

def process(string):
    words = string.split()
    vowels = ['a', 'e', 'i', 'o', 'u', 'y']
    for word in words:
        position = 0
        while word[position] not in vowels:
            position += 1

        if word[position] in vowels:
            yield word[position:] + word[:position] + "ay"


# Usage example
data = "Be sure to leave a comment if you can help the user out"
result = process(data)
for w in result:
     print(w)
输出:

eBay
uresay
otay
eavelay
aay
ommentcay
ifay
youay
ancay
elphay
ethay
useray
outay

使用生成器的一个小建议是:不要为它编写函数,使用类并重写它

更好地解释了原因,但简而言之,如果将函数迭代器传递给也将迭代对象的对象,它将获得对原始迭代器的引用。这会导致迭代器在第一个函数完全迭代之前被完全使用,您将得到StopIteration的回溯

重写iter允许我们获得迭代器的新实例,而不是引用

class Piglatin(object):
    """
    Overrides the __iter__ protocol for yielding a piglatin version
    of each word in a provided sentence.

    By overriding the __iter__ magic method, this iterator becomes consumable
    by multiple layers of function calls.
    """

    def __init__(sentence):
        self.sentence = sentence
        self.vowels = set(['a', 'e', 'i', 'o', 'y'])

    def __iter__(self):
        for word in self.sentence:
            position = 0
            while word[position] not in vowels:
                position += 1

            if word[position] in vowels:
                yield word[position:] + word[:position] + "ay"

我相信这是对上述问题更有效的回答。这是我关于堆栈溢出的第一个答案,我愿意接受任何形式的反馈

def navy_code(txt) :

for word in txt.split():

    first = word[0]
    if first in 'aeiouAEIOU' :
        crypt = word + 'ay'
    else :
        crypt = word[1:]+first+'ay'
    yield crypt


result = navy_code("Place the submarine under an allied countrys command if possible")
for answer in result:
 print(answer)

输出:lacePay hetay ubmarinesay UNDEAY anay ALIEDAY ountryscay ommandcay ifay ABLE PAY

感谢您的帮助Saleem。(也感谢所有在读这篇文章的人——我不知道S.O.是否同意表达感谢)欢迎你。这个论坛帮助那些付出了一些努力却不需要什么帮助来解决编程问题的人。请接受您认为更符合您期望的任何投稿人的回答。我无法重现您的问题。您输入的字符串似乎包含换行符。欢迎使用堆栈溢出!感谢您提供此代码片段,它可能会提供一些有限的短期帮助。通过说明为什么这是一个很好的问题解决方案来正确解释它的长期价值,并将使它对未来有其他类似问题的读者更有用。请在您的回答中添加一些解释,包括您所做的假设。
def navy_code(txt) :

for word in txt.split():

    first = word[0]
    if first in 'aeiouAEIOU' :
        crypt = word + 'ay'
    else :
        crypt = word[1:]+first+'ay'
    yield crypt


result = navy_code("Place the submarine under an allied countrys command if possible")
for answer in result:
 print(answer)