需要对给定的字符串进行排序(首先以x开头的字符串)

时间:2017-08-13 18:12:22

标签: python python-2.7

在给定['mix', 'xyz', 'apple', 'xanadu', 'aardvark']列表时,代码不会返回最后一个单词。

def front_x(words):
    x_list = []
    no_x_list = []
    [x_list.append(i) for i in words if i[0] == "x"]
    [no_x_list.append(words[i2]) for i2 in range(len(words)-1) if words[i2] not in x_list]
    x_list.sort()
    no_x_list.sort()
    return x_list + no_x_list
print front_x(['mix', 'xyz', 'apple', 'xanadu', 'aardvark'])

必须:

['xanadu', 'xyz', 'aardvark', 'apple', 'mix']

使用列表['bbb', 'ccc', 'axx', 'xzz', 'xaa']['ccc', 'bbb', 'aaa', 'xcc', 'xaa'],一切正确['xaa', 'xzz', 'axx', 'bbb', 'ccc']['xaa', 'xcc', 'aaa', 'bbb', 'ccc']

4 个答案:

答案 0 :(得分:3)

range(len(words)-1)上的迭代看起来不正确。更重要的是,使用列表理解进行列表追加非常 unpythonic ; list comps用于构建列表而不是制作列表附加,而不是具有讽刺意味

您可以通过基于两元组进行排序来执行排序一次,该元组的第一项检查单词是否以 'x'开头并将它们放在前面。元组中的第二项在列表中应用了lexicograhical排序,打破了联系:

def front_x(words):
    return sorted(words, key=lambda y: (not y.startswith('x'), y))

print front_x(['mix', 'xyz', 'apple', 'xanadu', 'aardvark'])
# ['xanadu', 'xyz', 'aardvark', 'apple', 'mix']

答案 1 :(得分:2)

只需从range(len(words)-1)中删除-1 这将是代码中的最小变化。

答案 2 :(得分:1)

你可以试试这个:

words = ['mix', 'xyz', 'apple', 'xanadu', 'aardvark']

new_words = [i for i in words if i[0].lower() == "x"]

words = [i for i in words if i[0].lower() != "x"]

final_words = sorted(new_words)+sorted(words)

print(final_words)

输出:

['xanadu', 'xyz', 'aardvark', 'apple', 'mix']

答案 3 :(得分:1)

您必须使用Liquid Exception: failed to allocate memory in <file> 代替Liquid Exception: string sizes too big in <file> jekyll 3.4.5 | Error: string sizes too big 才能获得预期的输出。

所以,试试这个:

len(words)

输出:

len(words)-1