字典相关排序

Posted DTCLOUD

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字典相关排序相关的知识,希望对你有一定的参考价值。

字典相关排序

sorted() 语法:

sorted(iterable, key=None, reverse=False)  
# 参数说明:
iterable -- 可迭代对象。
key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。

字典排序

# 字典按k排序
a = \'Z\': 1, \'Y\': 3, \'X\': 2

# 方式一
b  = k: a[k] for k in sorted(a.keys())
# \'X\': 2, \'Y\': 3, \'Z\': 1

# 方式二
b = sorted(a.items(), key=lambda x: x[0])
b = i[0]: i[1] for i in b
# \'X\': 2, \'Y\': 3, \'Z\': 1
# 字典按v排序
a = \'Z\': 1, \'Y\': 3, \'X\': 2
c = sorted(a.items(), key=lambda x: x[1])
# [(\'Z\', 1), (\'X\', 2), (\'Y\', 3)]

列表嵌套字典

# res = sorted(列表, key=lambda x: x[指定k], reverse=True降序)

d = ["name":"Jack","age":18,"money": 1000,"name":"Lily","age":20, "money": 3000,"name":"Jami","age":20, "money": 2000]
ds = sorted(d,key=lambda x:x[\'age\'],reverse=True)
ds2 = sorted(d,key=lambda x:(x[\'age\'], x[\'money\']))
print(ds)
print(ds2)

运行结果:
[\'name\': \'Lily\', \'age\': 20, \'money\': 3000, \'name\': \'Jami\', \'age\': 20, \'money\': 2000, \'name\': \'Jack\', \'age\': 18, \'money\': 1000]

[\'name\': \'Jack\', \'age\': 18, \'money\': 1000, \'name\': \'Jami\', \'age\': 20, \'money\': 2000, \'name\': \'Lily\', \'age\': 20, \'money\': 3000]

字典嵌套字典

# res = sorted(字典.items(), key=lambda x: x[1][指定k])

D = 10:"aa":1,"bb":2,11:"aa":2,"bb":0,12:"aa":0,"bb":3
ds = sorted(D.items(),key=lambda x:x[1][\'bb\'])
print(ds)

运行结果:
[(11, \'aa\': 2, \'bb\': 0), (10, \'aa\': 1, \'bb\': 2), (12, \'aa\': 0, \'bb\': 3)]

作者:陈超

使用日期 Swift 3 对字典数组进行排序

【中文标题】使用日期 Swift 3 对字典数组进行排序【英文标题】:Sorting of array of dictionary with date Swift 3 【发布时间】:2017-04-22 07:51:10 【问题描述】:

我有一个名为 myArray 的数组,其中添加了字典我希望该字典按时间排序,时间是字典中的一个键。那个时间是在字符串中。时间的日期格式为“yyyy/MM/dd HH:mm:ss”

我尝试了以下代码解决方案,但给出了“从'字符串转换?'”的警告到不相关的类型“日期”总是失败”。

let sortedArray = self.myArray.sorted ($0["Time"] as? Date)! > ($1["Time"] as? Date)! 
print(sortedArray)

如果有人可以帮助我,谢谢。

【问题讨论】:

你能指定你的时间格式吗? 我在问题@Rahul做了那个 你可以使用DateFormatter 顺便说一句,你(v as? T)! 的这个成语很有趣;-) 下次你可以简单地做v as! T 兄弟。我强烈建议您花时间全面学习 Swift Optionals — 长期来看会对您有很大帮助! 【参考方案1】:

这种排序不需要转换为日期时间。您使用的国际格式 (yyyy/MM/dd HH:mm:ss) 以字符串形式提供了正确的排序顺序。

【讨论】:

比较的好主意:) 为了清楚起见,您的代码变为let sortedArray = self.myArray.sorted ($0["Time"])! > ($1["Time"])! 【参考方案2】:

您必须使用此代码将字符串转换为日期:

 let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy/MM/dd HH:mm:ss"
    let date = dateFormatter.date(from: "2017/04/22 00:00:00") ?? Date()

所以,使用这个:

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy/MM/dd HH:mm:ss"

    let sortedArray = self.myArray.sorted[dateFormatter] one, two in
     return dateFormatter.date(from:one["Time"] )! > dateFormatter.date(from: two["Time"] )! 

【讨论】:

不,在这种情况下,您不需要将字符串转换为日期,因为日期字符串按原样采用可排序格式。 仅供参考 - 您发布的第一段代码将不起作用,因为字符串 22-04-2017 00:00:00 与格式说明符不匹配。格式说明符正确,示例日期字符串不正确。 @rmaddy 我得到“二元运算符 '>' 不能应用于两个 'Any' 操作数”,因为我有 [String:Any] 类型的字典数组。在这种情况下,我们必须将日期字符串转换为日期..【参考方案3】:
//Sort any dictionary with string dates using any date format
var incisions = [["initials": "B.B. ", "date": "12/18/17 09:39 AM", "patientID": "snowball"], ["patientID": "snowball", "date": "01/03/18 04:03 PM", "initials": "C.J."], ["initials": "B.B. ", "date": "01/04/18 09:47 AM", "patientID": "snowball"]]

func sortArrayDictDescending(dict: [Dictionary<String, String>], dateFormat: String) -> [Dictionary<String, String>] 
                let dateFormatter = DateFormatter()
                dateFormatter.dateFormat = dateFormat
                return dict.sorted[dateFormatter] one, two in
                    return dateFormatter.date(from: one["date"]! )! > dateFormatter.date(from: two["date"]! )! 
            

   //use:
let sortedArray = sortArrayDictDescending(dict: incisions, dateFormat: "MM/dd/yy a")

for i in sortedArray 
 print("incisions \(i["date"]!)")


//output:
incisions 01/04/18 09:47 AM
incisions 01/03/18 04:03 PM
incisions 12/18/17 09:39 AM

【讨论】:

【参考方案4】:

用日期对字典数组进行排序的简单代码

let formatter = NSDateFormatter()
formatter.dateFormat = "MMM d, yyyy hh:mm a"
formatter.locale = NSLocale(localeIdentifier: "en_US")

let sorted = displayArray.sort 
    formatter.dateFromString($0["fullfireDate"] as! String)?.compare(formatter.dateFromString($1["fullfireDate"] as! String)!) != .OrderedAscending
    

【讨论】:

以上是关于字典相关排序的主要内容,如果未能解决你的问题,请参考以下文章

杂谈:经典算法之字典序排列

python 字典排序

使用日期 Swift 3 对字典数组进行排序

Python中如何以dict的key排序输出?

Python中如何以dict的key排序输出?

列表元组字典等相关命令