【Codewars每日一题】- Simple Pig Latin

题目

题目地址

Move the first letter of each word to the end of it, then add “ay” to the end of the word. Leave punctuation marks untouched.

Examples

1
2
pig_it('Pig latin is cool') # igPay atinlay siay oolcay
pig_it('Hello world !') # elloHay orldWay !

思路

对字符串进程分割,得到一个字符串列表,然后再遍历列表,对每个字符串进行处理。同时考虑字符串的长度不同所需的处理方式不同。

答案

我的答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def pig_it(text):
t_list = text.split(" ")
r_list = []
for i in range(len(t_list)):
if len(t_list[i]) == 1:
if i!= len(t_list) - 1:
r_list.append(t_list[i] + "ay")
else:
r_list.append(t_list[i])
else:
r_list.append(t_list[i][1:] + t_list[i][0] + "ay")
result = ""
for x in r_list:
result += (x + " ")
return result.strip()

最佳答案

  • 最佳实践解法
    1
    2
    3
    def pig_it(text):
    lst = text.split()
    return ' '.join( [word[1:] + word[:1] + 'ay' if word.isalpha() else word for word in lst])

用了列表推导式,字符串的相关方法。另外,列表切片超出范围时,不会报错,而是返回空。这样就不再需要判断字符串长度的问题。

知识点

string.isalpha()()方法

检测字符串是否只由字母组成。

  • 语法

    1
    str.isalpha()
  • 返回值
    如果字符串至少有一个字符并且所有字符都是字母则返回 True,否则返回 False

  • 实例

    1
    2
    3
    4
    5
    6
    >>> "123".isalpha()
    False
    >>> "abc".isalpha()
    True
    >>> "abc!".isalpha()
    False
  • 类似方法

    • string.isalnum() - 至少有一个字符并且所有字符都是字母或数字
    • string.isdecimal() - 只包含十进制数字
    • string.isdigit() - 只包含数字
    • string.islower() - 包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是小写
    • string.isnumeric() - 只包含数字字符
    • string.isspace() - 只包含空格
    • string.istitle() - 仅包含以大写字母开头、后面都是小写字母的单词。
    • string.isupper() - 至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是大写

string.split()方法

通过指定分隔符对字符串进行切片,如果参数num 有指定值,则仅分隔 num 个子字符串

  • 语法
    1
    str.split(str="", num=string.count(str))

str – 分隔符,默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等。
num – 分割次数。

默认情况下字符串按照各种空白字符分割, 诸如空格、 制表符或换行符。

  • 返回值
    分割后的字符串列表。

  • 实例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    >>> spam = "I am   liu   hao"
    >>> spam.split()
    ['I', 'am', 'liu', 'hao']
    >>> spam.split(" ")
    ['I', 'am', '', '', 'liu', '', '', 'hao']

    >>> "Chris_iven+Chris_jack+Chris_lusy".split("+")
    ['Chris_iven', 'Chris_jack', 'Chris_lusy']
    >>> "Chris_iven+Chris_jack+Chris_lusy".split("-")
    ['Chris_iven+Chris_jack+Chris_lusy']
    >>> "Chris_iven+Chris_jack+Chris_lusy".split("_")
    ['Chris', 'iven+Chris', 'jack+Chris', 'lusy']
    >>> "Chris_iven+Chris_jack+Chris_lusy".split("+",2)
    ['Chris_iven', 'Chris_jack', 'Chris_lusy']
    >>> "Chris_iven+Chris_jack+Chris_lusy".split("+",1)
    ['Chris_iven', 'Chris_jack+Chris_lusy']

string.join()方法

用于将序列中的元素以指定的字符连接生成一个新的字符串。

join()方法是针对一个字符串而调用的,并且传入一个列表值(很容易不小心用其他的方式调用它)。split()方法做的事情正好相反:它针对一个字符串调用,返回一个字符串列表。

  • 语法
    1
    str.join(sequence)

sequence – 要连接的元素序列

  • 返回值
    返回通过指定字符连接序列中元素后生成的新字符串。

  • 实例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    >>> str = "-"
    >>> seq = ('a','b','c')
    # 会为每一个元素添加一个指定字符,不会再最后的地方添加
    >>> str.join(seq)
    'a-b-c'
    >>> str.join(['1','2','3'])
    '1-2-3'
    # 当连接字符串时,会自动将字符串分割
    >>> str.join("abc")
    'a-b-c'
    >>> str.join("abc o o")
    'a-b-c- -o- -o'
    >>> str.join("123")
    '1-2-3'
hoxis wechat
一个脱离了高级趣味的程序员,关注回复1024有惊喜~
赞赏一杯咖啡
0%