在不使用索引的情况下更改列表的值

2024-05-16 07:50:24 发布

您现在位置:Python中文网/ 问答频道 /正文

def apply_coder(text, coder):
    """
    Applies the coder to the text. Returns the encoded text.

    text: string
    coder: dict with mappings of characters to shifted characters
    returns: text after mapping coder chars to original text
    """

    coder_dict = coder
    text_list = list(text)
    for letter in text_list:
        if letter in coder_dict:
            letter = coder_dict[letter]
            print letter
    return ''.join(text_list)

示例: 应用编码器(“你好,世界!”,build_encoder(3))应返回

'Khoor,czruog!'

相反,它又回来了

"Hello, world!"

但是,如果在if条件下使用print letter语句,它将打印正确的字母。你知道吗


Tags: thetotextinifdefdictlist
3条回答

语句letter = coder_dict[letter]只是在coder_dict中查找letter键,并将该值赋给letter,这不会改变它。它打印出那封信。但是,您根本没有修改text_list。有几种方法可以做到这一点,例如使用enumerate

def apply_coder(text, coder):
    text_list = list(text)
    for val,letter in enumerate(text_list):
        text_list[val] = coder.get(letter, letter)
    return ''.join(text_list)

这将枚举list,然后用字母查找(如果可能)或字母本身重新分配每个索引元素,然后join()分配listreturn它。你知道吗

通过改变letter,你是而不是改变列表中的任何东西text_list。您应该构建一个新列表,而不是编码的结果:

def apply_coder(text, coder):
    ret_val = []
    coder_dict = coder
    for letter in text:
        if letter in coder_dict:
            letter = coder_dict[letter]
            print letter
        ret_val.append(letter)
    return ''.join(ret_val)

这也意味着您不必首先将text放入一个列表。你知道吗

重新绑定当前迭代变量不会修改列表(希望-这会是一个非常烦人的副作用)。你知道吗

另外,将coder重新绑定到coder_dict也没用,您可以对字符串进行迭代。长话短说,解决办法是用修改过的字母重建一个列表。。。既然你不需要列表本身,你也可以使用一个生成器表达式:

def apply_coder(text, coder):
    return ''.join(coder.get(letter, letter) for letter in text)

相关问题 更多 >