我有一个看起来有点像的文本文件:
random text random text, can be anything blabla %A blabla
random text random text, can be anything blabla %D blabla
random text random text, can be anything blabla blabla %F
random text random text, can be anything blabla blabla
random text random text, %C can be anything blabla blabla
当我readlines()
时,它就成了一个句子列表。现在我希望这个列表按%
之后的字母排序。所以基本上,当排序应用于上面时,它应该看起来像:
random text random text, can be anything blabla %A blabla
random text random text, %C can be anything blabla blabla
random text random text, can be anything blabla %D blabla
random text random text, can be anything blabla blabla %F
random text random text, can be anything blabla blabla
有没有一种好方法可以做到这一点,或者我是否必须将每个字符串分解为tubles,然后将字母移动到特定列,然后使用key=operator.itemgetter(col)
进行排序?
谢谢
答案 0 :(得分:6)
In [1]: def grp(pat, txt):
...: r = re.search(pat, txt)
...: return r.group(0) if r else '&'
In [2]: y
Out[2]:
['random text random text, can be anything blabla %A blabla',
'random text random text, can be anything blabla %D blabla',
'random text random text, can be anything blabla blabla %F',
'random text random text, can be anything blabla blabla',
'random text random text, %C can be anything blabla blabla']
In [3]: y.sort(key=lambda l: grp("%\w", l))
In [4]: y
Out[4]:
['random text random text, can be anything blabla %A blabla',
'random text random text, %C can be anything blabla blabla',
'random text random text, can be anything blabla %D blabla',
'random text random text, can be anything blabla blabla %F',
'random text random text, can be anything blabla blabla']
答案 1 :(得分:3)
def k(line):
v = line.partition("%")[2]
v = v[0] if v else 'z' # here z stands for the max value
return v
print ''.join(sorted(open('data.txt', 'rb'), key = k))
答案 2 :(得分:1)
您可以使用自定义key
函数来比较字符串。使用lambda
语法,您可以编写内联,如下所示:
strings.sort(key=lambda str: re.sub(".*%", "", str));
re.sub(".*%", "", str)
调用会在第一个百分号前有效删除任何内容,因此如果字符串有百分号,则会比较后面的内容,否则它将比较整个字符串。
迂腐地说,这不仅仅使用百分号后面的字母,它还使用了之后的所有内容。如果你想使用这封信和只这封信,请尝试这个稍微长一点的行:
strings.sort(key=lambda str: re.sub(".*%(.).*", "\\1", str));
答案 3 :(得分:1)
这是一种快速而肮脏的方法。如果不了解您的排序要求,我不知道这是否满足您的需求。
假设您的列表中包含“listoflines
”:
listoflines.sort( key=lambda x: x[x.find('%'):] )
请注意,这将按所有行排序,而不是'%'字符的最终字符。