在Oracle SQL中,有一个要按如下顺序排序的功能:
order by decode("carrot" = 2
,"banana" = 1
,"apple" = 3)
在python中实现它的最佳方法是什么?
我希望能够通过其键来命令一个字典。而且该顺序不一定按字母顺序或任何其他顺序 - 我确定顺序。
答案 0 :(得分:15)
使用key
的{{1}}命名关键字参数。
sorted()
为了获得比#set up the order you want the keys to appear here
order = ["banana", "carrot", "apple"]
# this uses the order list to sort the actual keys.
sorted(keys, key=order.index)
更高的效果,您可以使用list.index
代替。
dict.get
答案 1 :(得分:4)
你不能自己订购一个字典,但是你可以将它转换为(键,值)元组的列表,你可以对它进行排序。
使用.items()方法执行此操作。例如,
>>> {'a': 1, 'b': 2}
{'a': 1, 'b': 2}
>>> {'a': 1, 'b': 2}.items()
[('a', 1), ('b', 2)]
最有效的排序方法是使用键功能。使用cmp效率较低,因为必须为每对项目调用它,使用key只需要为每个项目调用一次。只需指定一个可调用项,它将根据项目的排序方式对项进行转换:
sorted(somedict.items(), key=lambda x: {'carrot': 2, 'banana': 1, 'apple':3}[x[0]])
上面定义了一个dict,它指定了你想要的键的自定义顺序,lambda为旧dict中的每个键返回该值。
答案 2 :(得分:1)
Python的dict是一个hashmap,所以它没有顺序。但您可以单独对键进行排序,使用keys()方法从字典中提取它们。
sorted()
将比较和关键函数作为参数。
您可以使用
执行解码的精确复制sortedKeys = sorted(dictionary, {"carrot": 2
,"banana": 1
,"apple": 3}.get);
答案 3 :(得分:1)
你无法对字典进行排序;字典是映射,映射没有排序。
您可以提取密钥并对其进行排序,但是:
keys = myDict.keys()
sorted_keys = sorted(keys, myCompare)
答案 4 :(得分:1)
新的Python版本中会OrderedDict
:http://www.python.org/dev/peps/pep-0372/。
与此同时,您可以尝试其中一种替代方案:http://code.activestate.com/recipes/496761/,Ordered Dictionary。
答案 5 :(得分:0)
没有订购字典。您需要保留一个密钥列表。
您可以将自己的比较函数传递给list.sort()或sorted()。
如果你需要对多个键进行排序,只需将它们连接到一个元组中,然后对元组进行排序。