cmp_to_key在.csv文件的python3中不起作用

时间:2020-04-23 15:20:28

标签: python python-3.x sorting pyicu

我正在使用.csv文件,因此我需要按特定列进行排序 这个答案不起作用:

sorting with two key= arguments

因此使用来自

的想法

How do I sort unicode strings alphabetically in Python?

我们有

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

1 个答案:

答案 0 :(得分:2)

我认为您的呼叫使用了错误的按键功能。

来自docs.python.org

key参数的值应该是一个函数,该函数接受单个参数并返回用于排序目的的键。这种技术之所以快捷,是因为每个输入记录都只对键函数调用一次。

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

python3首先按第一项对元组进行排序,因此将“ A”与“α”(字节顺序,不是字母顺序)进行比较,如果相等,则将collat​​or.getSortKey与collat​​or.getSortKey进行比较。

我认为您想使用以下lambda,我相信它可以传达您想要发生的事情。

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

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