【问题标题】:Getting every nth character in the string in Python在Python中获取字符串中的每个第n个字符
【发布时间】:2018-03-12 05:55:19
【问题描述】:

我有以下功能,但它没有给我预期的结果:

def GetNthLetters(text,n):
    builtstring=""
    for letter in text:
        if text.index(letter)%n==0:
            builtstring=builtstring+letter
            print letter 
    return builtstring   

【问题讨论】:

  • 容易多了:return text[::n]
  • 为什么不使用 text[n]?
  • 在这种情况下,我们很容易看出您做错了什么,但您应该真的包含一些示例输入、预期输出以及您看到的内容。

标签: python arrays string


【解决方案1】:

如果有人要求我给出字符串中的每个第 n 个字符,我不会包含第一个字符。我宁愿做如下的事情:

def GetNthLetters(text, n):
    builtstring = ""
    for i in range(0, len(text)):
        if (i + 1) % n == 0:
            # print(text[i])
            builtstring = builtstring + text[i]
    return builtstring


text = '1234567890123456789012345678901234567890'

nthLetters = GetNthLetters(text, 1)
print(nthLetters)
nthLetters = GetNthLetters(text, 2)
print(nthLetters)
nthLetters = GetNthLetters(text, 3)
print(nthLetters)
nthLetters = GetNthLetters(text, 10)
print(nthLetters)
nthLetters = GetNthLetters(text, 40)
print(nthLetters)

这将产生以下结果:

1234567890123456789012345678901234567890

24680246802468024680

3692581470369

0000

0

【讨论】:

    【解决方案2】:

    str.index() 为您的信件找到第一个匹配项。如果你有一个字母出现了不止一次,那会给你错误的索引。对于任何给定的字符,您只测试它们在字符串中的 first 出现是否在第 n 个位置。

    为了演示,看一下带有字符索引的字符串'hello world'(我使用. 来标记空格):

    0 1 2 3 4 5 6 7 8 9 10
    h e l l o . w o r l d
    

    对于字母ltext.index('l') 将返回2,因此它只会在n12 时包含在输出中。 l 也出现在索引 3 或 9 上并不重要,因为您只测试过 2 % n == 0。这同样适用于 'o'(位置 4 和 7),只有 4 % n == 0 被测试。

    您可以使用enumerate() function 为您提供运行索引:

    def GetNthLetters(text, n):
        builtstring = ""
        for index, letter in enumerate(text):
            if index % n == 0:
                builtstring = builtstring + letter
        return builtstring
    

    现在index 对每个字母都是正确的,无论是否重复。

    但是,使用切片会容易得多:

    def GetNthLetters(text, n):
        return text[::n]
    

    这也需要每 n 个字母:

    >>> 'foo bar baz'[::2]
    'fobrbz'
    >>> 'foo bar baz'[::3]
    'f ra'
    >>> 'foo bar baz'[::4]
    'fbb'
    

    【讨论】:

    • 你的答案不是和提问者的程序一样吗?​​
    • @Harry:它没有。请注意,提问者没有给我们任何例子
    • @Harry: GetNthLetters('Hello World!', 4) 应该产生'Hor',但是OP的版本却给出了'Hoor'。包含索引 7 处的第二个 'o',因为第一个 'o' 位于位置 4
    • 知道了。它因为索引将始终返回第一个找到的索引。谢谢编辑我的答案。
    【解决方案3】:

    代码的问题是每次相同重复字母的索引都会给出相同的结果。

    例如 'Hello World!'.index('o') 将始终为 4,因此不会给出预期的结果。

    最好的方法是enumerate for 循环。所以你会得到适当的索引。

    您还应该记住数组以 0 而不是 1 开头。

    【讨论】:

    • 不,发布的答案确实 not 产生相同的输出。您需要使用带有重复字符的输入字符串进行测试。
    • 是的,所以现在只是对我的回答的重新措辞。这与起始索引无关。
    • 是的,不想删除答案。也不想让它错了。
    【解决方案4】:

    使用 Python 的 slicing 语法:

    Python 的 slicing 语法很像 range() 函数。它接受startstopstep 值:

    string[start : stop : step]

    您可以将任何参数留空,它们将分别默认为0、字符串长度和1

    这意味着你可以这样做:

    string[::n]

    获取每个nth 字符的字符串。

    所以你可以把function写成:

    def getNthLetters(text, n):
       return text[::n]
    

    希望这是你想要的!

    【讨论】:

    • 当然,但是 OP 在实施中哪里出了问题?
    • @MartijnPieters 老实说,我没有测试过他的function,我只是测试过,而且效果很好,所以我不确定他为什么说:“它没有给我预期的效果结果”
    • @MartijnPieters 啊,是的,错过了,但为什么不直接使用slicing
    • 我没有说切片是错误的。这是最好的解决方案。我只是指出问题是关于 OPs 的实施,你忽略了。
    • @MartijnPieters 好的,我明白了:)
    【解决方案5】:
    string = "12345678"
    
    n = 2
    
    splitted_string = string[::n]
    
    print(splitted_string)
    
    # Output : 1357
    

    希望这会有所帮助。!

    【讨论】:

    • 使用不重复字符的字符串很难证明 OP 所犯的错误。
    猜你喜欢
    • 2017-09-24
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 2015-12-14
    相关资源
    最近更新 更多