使用具有关键多个参数的L.sort对字符串列表进行排序

时间:2012-09-26 13:59:42

标签: python

对Python很新,并且一直在使用列表和排序成员。我的问题是,如果我有一个随机字符串列表(所有相同长度的字符串):

li=["hgjtud", "iernfd", "scoeps", "stiiss", "stripe"]

现在我想根据我用以下函数定义的某个等级对该列表进行排序:

def rank_string(str1,str2):
    rank=0
    for i in range(len(str1)): #all strings will be checked to be equal length
        if (str1[i]==str2[i]):
            rank += 1
    return rank

现在我想使用此函数和目标字符串对列表进行排序,因此我尝试以下操作:

target_string="stripe"
df = lambda x:rank_string(x,target_string)
sorted_list = resultlist.sort(key=df)

我的印象是,在排名函数一次通过后,所有列表值都将被赋予一个键,然后按照这个排序?这会运行,但sorted_list的值为None。我假设那是一个n00b,我遗漏了一些基本的东西。什么? :-)

感谢您的帮助。

4 个答案:

答案 0 :(得分:1)

.sort()方法对就地进行排序,但不会返回任何内容。

如果您希望返回已排序的列表并保持原始输入列表不变,请使用sorted()

>>> a = [2, 3, 1]
>>> a.sort()
>>> a
[1, 2, 3]
>>> b = [2, 3, 1]
>>> sorted(b)
[1, 2, 3]
>>> b
[2, 3, 1]

答案 1 :(得分:1)

正如其他人所说,sorted()将返回一个新列表。您的代码可能如下所示:

li = ["hgjtud", "iernfd", "scoeps", "stiiss", "stripe"]
target_string = "stripe"

sorted_list = sorted(li, key=lambda x: sum(1 for c1,c2 in zip(x, target_string) if c1==c2))

返回['hgjtud', 'iernfd', 'scoeps', 'stiiss', 'stripe']

答案 2 :(得分:1)

与其他人说的一样,使用sorted()。你也可以缩短时间:

from functools import partial

def rank_string(str1, str2):
    return sum(a == b for a, b in zip(str1, str2))

li = ["hgjtud", "iernfd", "scoeps", "stiiss", "stripe"]
sorted_list = sorted(li, key=partial(rank_string, "stripe"))

[编辑]

from operator import eq

def rank_string(str1, str2):
    return sum(map(eq, str1, str2))

: - )

[/编辑]

答案 3 :(得分:0)

resultlist.sort是一种列表方法,对结果列表进行排序,并返回None

sorted_list = sorted(li, key=df)  应该做的。