cmp_to_密钥在python3中不适用于.csv文件

cmp_to_密钥在python3中不适用于.csv文件,python,python-3.x,sorting,pyicu,Python,Python 3.x,Sorting,Pyicu,我正在处理.csv文件,因此需要按特定列进行排序 这个答案行不通: 因此,使用来自 我们有 在python2中 import icu # conda install -c conda-forge pyicu collator = icu.Collator.createInstance(icu.Locale('el_GR.UTF-8')) parts = [('3', 'ά', 'C'), ('6', 'γ', 'F'), ('5', 'β', 'E'),

我正在处理
.csv
文件,因此需要按特定列进行排序 这个答案行不通:

因此,使用来自

我们有

python2中

import icu # conda install -c conda-forge pyicu
collator = icu.Collator.createInstance(icu.Locale('el_GR.UTF-8'))
parts = [('3', 'ά', 'C'),
         ('6', 'γ', 'F'),
         ('5', 'β', 'E'),
         ('4', 'Ἀ', 'D'),
         ('2', 'Α', 'B'),
         ('1', 'α', 'A')]
foo = sorted(parts, key=lambda s: (s[1]), cmp=collator.compare)
for c in foo: 
  print c[0], c[1].decode('utf-8'), c[2]
如果结果正确:

1 α A
2 Α B
4 Ἀ D
3 ά C
5 β E
6 γ F
但是在
python3

import icu # conda install -c conda-forge pyicu
from functools import cmp_to_key
collator = icu.Collator.createInstance(icu.Locale('el_GR.UTF-8'))
parts = [('3', 'ά', 'C'),
         ('6', 'γ', 'F'),
         ('5', 'β', 'E'),
         ('4', 'Ἀ', 'D'),
         ('2', 'Α', 'B'),
         ('1', 'α', 'A')]
foo = sorted(parts, key=lambda s: (s[1], collator.getSortKey))
#foo = sorted(parts, key=lambda s: (s[1], collator.compare))#the same result as collator.getSortKey
for c in foo: 
  print (c[0], c[1], c[2])
结果是错误的:

2 Α B
1 α A
5 β E
6 γ F
4 Ἀ D
3 ά C

我想你的电话是用错键的

发件人:

key参数的值应该是一个函数,它接受一个参数并返回一个用于排序的键。这种技术很快,因为每个输入记录只调用一次键函数

键lambda返回一个包含字符和函数的元组

python3首先按第一项对元组进行排序,因此将“Α”与“α”(字节顺序,而不是字母顺序)进行比较,如果它们相等,则将collator.getSortKey与collator.getSortKey进行比较

我想你应该使用下面的lambda,我相信它表达了你想要发生的事情

foo = sorted(parts, key=lambda s: collator.getSortKey(s[1]))

这应该按字母顺序排序,而不是按字节顺序。

collator.getSortKey实际返回什么?您可能需要类似于
key=lambda s:cmp\u to\u key(collator.compare)(s[1])的内容。