cmp_to_key 在 python3 中不适用于 .csv 文件
cmp_to_key is not working in python3 for .csv files
我正在处理 .csv
个文件,所以我需要按特定列排序
此答案无效:
因此使用来自
的想法
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
我认为您的呼叫排序错误的键功能。
The value of the key parameter should be a function that takes a single argument and returns a key to use for sorting purposes. This technique is fast because the key function is called exactly once for each input record.
您的密钥 lambda returns 包含字符和函数的元组。
python3 先按第一项对元组进行排序,因此将“α”与“α”(字节顺序,而不是字母顺序)进行比较,如果它们相等,则将 collator.getSortKey 与collator.getSortKey.
我想你想使用下面的 lambda,我相信它传达了你想要发生的事情。
foo = sorted(parts, key=lambda s: collator.getSortKey(s[1]))
这应该按字母顺序而不是字节顺序排序。
我正在处理 .csv
个文件,所以我需要按特定列排序
此答案无效:
因此使用来自
的想法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
我认为您的呼叫排序错误的键功能。
The value of the key parameter should be a function that takes a single argument and returns a key to use for sorting purposes. This technique is fast because the key function is called exactly once for each input record.
您的密钥 lambda returns 包含字符和函数的元组。
python3 先按第一项对元组进行排序,因此将“α”与“α”(字节顺序,而不是字母顺序)进行比较,如果它们相等,则将 collator.getSortKey 与collator.getSortKey.
我想你想使用下面的 lambda,我相信它传达了你想要发生的事情。
foo = sorted(parts, key=lambda s: collator.getSortKey(s[1]))
这应该按字母顺序而不是字节顺序排序。