【问题标题】:Sorting by multiple rules按多个规则排序
【发布时间】:2019-06-01 08:43:25
【问题描述】:

字典,其中键是三个分隔的字符,键是不同大小的列表,使用 sort/sorted 函数按值数组的长度对字典进行排序。如果 values 数组的长度相等,则按 key 中的第三个元素(字符)对其进行排序。如果在这种情况下也出现冲突,请按 key 中的第二个元素按升序对其进行排序。字符大小(上/下)无关紧要。

我已经设法按值的长度对其进行排序,但我无法找到解决方案如何找到冲突以及使用其他两个排序规则。

x = {("a", "B", "b"):[2, 0], ("A", "c", "b"):[2,1], ("d", "a", "C"):[0, 0, 0], 
     ("A", "A", "A"):[2], ("e", "e", "t"):[2, 3]}

sort1 = sorted(x.items(), key = lambda x: x[1].__len__())

input = {("a", "B", "b"):[2, 0], ("A", "c", "b"):[2,1], ("d", "a", "C"):[0, 0, 0], 
         ("A", "A", "A"):[2], ("e", "e", "t"):[2, 3]}

expected_output = [(("A", "A", "A"):[2]),(("e", "e", "t"):[2, 3]),
                   (("A", "B", "b"):[2, 1]),(("a", "c", "b"):[2, 0]),
                   (("d", "a", "C"),[0, 0, 0])]

【问题讨论】:

  • key like key = lambda x: (len(x[1],x[1]) 你明白了:每个标准一个元组项
  • 你能解释一下你的预期输出吗?我认为这与您对问题的解释相矛盾。

标签: python sorting


【解决方案1】:

可以将tuple 用于key 参数。
这里我使用ord函数对字符进行降序排序。

x = {("a", "B", "b"):[2, 0], ("A", "c", "b"):[2,1], ("d", "a", "C"):[0, 0, 0], ("A", "A", "A"):[2], ("e", "e", "t"):[2, 3]}

sorted(x.items(), key=lambda x: (len(x[1]), -ord(x[0][2].lower()), x[0][1].lower()))

[(('A', 'A', 'A'), [2]),
 (('e', 'e', 't'), [2, 3]),
 (('a', 'B', 'b'), [2, 0]),
 (('A', 'c', 'b'), [2, 1]),
 (('d', 'a', 'C'), [0, 0, 0])]

【讨论】:

  • 我看不到OP谈论降序的地方。该输出也与预期输出不匹配。
  • @Austin 我认为 OP 在发布输出时并不是非常精确。我通过输出推断出“降序”(希望 OP 在这方面是精确的),并通过请求第二个元素的升序,你不同意吗?
  • 你说的感觉一样,但 OP 仍然期待不同的输出。
  • @Austin 预期输出在语法上甚至无效
  • 忘记语法,另一方面,顺序很重要(因为排序),它看起来与您的输出不同。
猜你喜欢
  • 2012-09-11
  • 2016-10-03
  • 1970-01-01
  • 1970-01-01
  • 2018-02-19
  • 2012-12-13
  • 2018-03-20
  • 2018-03-10
  • 2016-10-06
相关资源
最近更新 更多