【问题标题】:sorting List of list using python使用python对列表进行排序
【发布时间】:2017-09-05 13:29:22
【问题描述】:

我有清单

value =[(22, 11, 195, 37), (19, 11, 184, 45), (300, 17, 12, 19), (210, 18, 128, 30) (100, 18, 128, 30)]

现在我需要结合升序列表中的前两个值对列表进行排序。

喜欢这个

s = [(19, 11, 184, 45), (22, 11, 195, 37), (300, 17, 12, 19),(100, 18, 128, 30), (210, 18, 128, 30) ]

我用过

s = sorted(value, key = lambda x: (x[1], x[0]))

我最终像这样对列表的第二个 (x[1]) 值进行排序,

s = [(22, 11, 195, 37), (19, 11, 184, 45), (300, 17, 12, 19), (210, 18, 128, 30) (100, 18, 128, 30)]

有什么方法吗?我也尝试过使用运算符库,它给了我相同的结果。

【问题讨论】:

标签: python sorting


【解决方案1】:

正如您所理解的,sorted 函数(以及 list.sort 方法)采用一个键作为可选参数,它告诉如何对元素进行排序。

您使用lambda x: (x[0], x[1]) 作为键,但您的输出清楚地表明您希望第二个成员比第一个成员具有更高的优先级。 试试这个键:

l = sorted(l, key=lambda t: (t[1], t[0]))

这将赋予每个元组的第二个成员更高的重要性。

正如预期的那样,输出是:

[(0, 0, 559, 225),
(19, 11, 184, 45),
(22, 11, 195, 37),
(300, 17, 12, 19),
(210, 18, 128, 30)]

【讨论】:

  • 旁注:Using operator.itemgetter 可以在这里进行更多的自我记录(并且速度更快作为奖励),例如key=itemgetter(1, 0).
  • @ShadowRanger 这很聪明。我不知道itemgetter
  • 我使用了相同的 s = sorted(calculation, key = lambda x: (x[1], x[0])) 我仍然没有为我的原始列表排序。我在下面评论过
  • [(0, 0, 559, 225), (344, 11, 195, 37), (19, 11, 184, 45), (209, 18, 128, 30), ( 517, 20, 12, 19), (492, 20, 16, 5), (354, 20, 9, 4), (476, 21, 7, 15), (435, 21, 21, 17), ( 404, 21, 15, 17), (30, 21, 15, 17), (305, 28, 8, 10), (242, 28, 2, 1), (128, 28, 7, 10), ( 83, 28, 13, 10), (61, 28, 12, 10), (354, 32, 11, 7), (492, 33, 16, 6), (285, 37, 1, 1), ( 242, 37, 3, 1), (221, 37, 1, 1), (152, 37, 2, 1), (291, 64, 138, 46), (132, 65, 154, 37), ( 142, 74, 10, 5), (403, 81, 3, 11), (379, 82, 15, 10), (360, 82, 2, 1)] 这是我列表的一部分
  • @DeepanRaj 我认为问题在于您的标准没有明确定义。您问的内容很不清楚,但是我为您提供的解决方案确实适用于您提供的示例列表。您能否尝试更准确地定义您期望的行为?
【解决方案2】:

好吧,经过大量的摆弄,我想我做到了。这是我的代码:

sorted(s, key=lambda x: (x[1] * 1, x[0]))

输出是:

[(19, 11, 184, 45), (22, 11, 195, 37), (300, 17, 12, 19), (100, 18, 128, 30), (210, 18, 128, 30)]

这基本上是按索引 1 对元组进行排序,但如果两个或多个元组在索引 1 上具有相同的编号,它会检查它们的索引 0 编号并按升序对它们进行排序。

【讨论】:

  • 其实列表很大,所以我自己做了一个列表,这里是完整列表 [(0, 0, 559, 225), (344, 11, 195, 37), (19, 11, 184, 45), (209, 18, 128, 30), (517, 20, 12, 19), (492, 20, 16, 5), (354, 20, 9, 4), (476, 21, 7, 15), (435, 21, 21, 17), (404, 21, 15, 17), (30, 21, 15, 17), (305, 28, 8, 10), (242, 28, 2, 1), (128, 28, 7, 10), (83, 28, 13, 10), (61, 28, 12, 10), (354, 32, 11, 7), (492, 33, 16, 6), (285, 37, 1, 1), (242, 37, 3, 1), (221, 37, 1, 1), (152, 37, 2, 1), (291, 64, 138, 46), (132, 65, 154, 37), (142, 74, 10, 5), (403, 81, 3, 11), (379, 82, 15, 10), (360, 82, 2, 1)]
  • 即使这是列表的一部分。我想对列表中的前两个值进行排序
  • @DeepanRaj 是的,但是您希望如何对其进行排序?前两个值是什么意思。问题不清楚...
  • 列表中的前两个值表示 [(0,0,559,225)] 在前两个值 0 和 0 中,基于这两个值的升序组合我需要对列表进行排序
  • 您的问题与您提供的示例相矛盾
猜你喜欢
  • 2022-12-21
  • 2018-04-17
  • 1970-01-01
  • 2011-08-25
  • 1970-01-01
  • 2017-09-09
  • 1970-01-01
相关资源
最近更新 更多