【发布时间】:2018-04-09 01:52:29
【问题描述】:
我有一大堆Dicts,看起来都像这样
{
"id": 12345,
"user_id": "6789",
"question_id": "some_question_id",
"correct": "true",
"actions": "...",
"consequentiality": 0,
"timestamp": 1505123456.000
}
我需要按(question_id, user_id, id, consequentiality) 对它们进行排序,question_id 移动最慢,consequentiality 移动更快——有点像分组和子分组,如果你愿意的话,但我需要对有序的进行交换在某些情况下排列,其中大多数往往发生在组之间。我一直在玩Base.sort,将不同的函数传递给by 和lt。我想出的最好的方法是将多种排序组合在一起,并将不同的键传递给每个 by 子句,类似于
sort(sort(sort(sort(df, by=x->x["question_id"]), by=x->x["user_id"] ...
你明白了。到目前为止,即使使用MergeSort 之类的稳定算法,我也无法达到令人满意的稳定排序。
帮助?
EDIT 在by 子句中使用元组有意义吗?但是,如何反转非数字元素的顺序?
【问题讨论】:
-
试试
sort(df, by=x->getindex.(x,("question_id", "user_id", "id", "consequentiality"))) -
关于反转非数字值的顺序,这可能需要在
lt=参数中使用自定义小于函数。 -
要对非数字用户名字段进行反向排序,例如,您可以这样做:
sort(df, lt=(x,y)->lexless((x["question_id],false,x["id"]),(y["question_id],x["username"]>y["username"],y["id"])))。这首先按question_id排序,然后按username反向排序,然后按id排序(诀窍是将false 与username上的大于表达式进行比较,从而颠倒顺序) -
好的,通过您的最新编辑(交换真假并更改比较符号),我可以让一切井井有条。我很困惑,因为
"id"出现错误,我无法扭转它。 -
现在,任务是让它看起来更漂亮,检查效率,也许定义一个函数来让它更干净。
标签: arrays sorting dictionary julia