python csv与'right'变音符号排序

时间:2014-12-30 11:40:05

标签: python csv diacritics alphabetical-sort

我正在尝试修改csvsort.py(csvkit,https://csvkit.readthedocs.org/en/0.9.0/)以正确处理变音符号。

我发现这段代码(http://www.gossamer-threads.com/lists/python/python/1030549)非常适合排序列表:

alphabet = (
u' ', u'.', u'\'', u'-', u'0', u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9', u'a', u'A', u'ä', u'Ä', u'á', u'Á', u'â', u'Â',
u'à', u'À', u'å', u'Å', u'b', u'B', u'c', u'C', u'ç', u'Ç', u'd', u'D', u'e', u'E', u'ë', u'Ë', u'é', u'É', u'ê', u'Ê', u'è', u'È',
u'f', u'F', u'g', u'G', u'h', u'H', u'i', u'I', u'ï', u'Ï', u'í', u'Í', u'î', u'Î', u'ì', u'Ì', u'j', u'J', u'k', u'K', u'l', u'L',
u'm', u'M', u'n', u'ñ', u'N', u'Ñ', u'o', u'O', u'ö', u'Ö', u'ó', u'Ó', u'ô', u'Ô', u'ò', u'Ò', u'ø', u'Ø', u'p', u'P', u'q', u'Q',
u'r', u'R', u's', u'S', u't', u'T', u'u', u'U', u'ü', u'Ü', u'ú', u'Ú', u'û', u'Û', u'ù', u'Ù', u'v', u'V', u'w', u'W', u'x', u'X',
u'y', u'Y', u'z', u'Z'
) 

hashindex = {character:index for index, character in enumerate(alphabet)}
def string2sortlist(string):
    return [hashindex[s] for s in string]


import random
things_to_sort = ["".join(random.sample(alphabet, random.randint(4, 6)))
for _ in range(200000)]

print(things_to_sort[:15])

things_to_sort.sort(key=string2sortlist)

print(things_to_sort[:15])

所以问题是:

我应该如何修改

sorter = lambda r: [(r[c] is not None, r[c]) for c in column_ids]
rows.sort(key=sorter, reverse=self.args.reverse)

来自csvsort.py,从上面的工作代码中使用hashindex()。

TIA。

米格尔。

1 个答案:

答案 0 :(得分:0)

排序调用的key参数是一个函数,用于说明如何(按什么顺序)对项进行排序。

显然csvkit使用带有布尔值然后是值的元组来对值进行排序并在末尾有空列(大概可能是它在开头)。

请注意,csvkit的函数应用于每一行进行排序,但sorter函数始终应用于列id,在每一行都给出相同的顺序。

因此,您应该定义哈希和排序函数,然后仅修改排序器函数:

sorter = lambda r: [(r[c] is not None, string2sortlist(r[c])) for c in column_ids]

这可以使用空列标题保持行为。使用其他列标题,您可以使用字符的散列值列表替换字符串,从而为您提供所需的排序。

它仍然只像以前一样应用于列标题,所以你在每一行的排序应该是相同的。