2012-09-26 14 views
0

对Python很新颖,并且一直在使用列表和排序成员。我的问题是,如果我有随机的字符串列表(长度相等的所有字符串):使用具有多个关键参数的L.sort排序字符串列表

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,我错过了一些基本的东西。什么? :-)

感谢您的帮助提前。

回答

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] 
+0

没错!按我的预期工作。谢谢。 – Englishbob

0

resultlist.sort是列表的方法中,代替排序resultlist,并返回None

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

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']

+0

我开始意识到,简洁是非常pythonesque :-)是要走的路。谢谢。 – Englishbob

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)) 

:-)

[/编辑]

+0

再次,我想简单与熟悉.-) – Englishbob

+0

@Englishbob:关于简洁,请参阅我的编辑。 – pillmuncher