【问题标题】:Sorting a list of lists in python alphabetically by "column"按“列”按字母顺序对python中的列表进行排序
【发布时间】:2014-01-10 21:30:33
【问题描述】:

我有一个二维字符列表,例如

 [['J', 'A', 'M', 'E', 'S'],
 ['F', 'C', 'A', 'A', 'A'],
 ['F', 'A', 'B', 'B', 'B']]

按字母顺序对第一个列表进行排序的最佳方法是什么,接下来的列表如下,即:

[['A', 'E', 'J', 'M', 'S'],
['C', 'A', 'F', 'A', 'A'],
['A', 'B', 'F', 'B', 'B']]

【问题讨论】:

  • 如果第一个列表是['J', 'M', 'M', 'E', 'S'],预期的输出是什么?

标签: python list sorting lambda 2d


【解决方案1】:

你可以使用zip():

>>> [list(t) for t in zip(*sorted(zip(*s)))]
[['A', 'E', 'J', 'M', 'S'], ['C', 'A', 'F', 'A', 'A'], ['A', 'B', 'F', 'B', 'B']]

s 是您的列表列表。

【讨论】:

  • 请注意,如果第一个列表包含重复项,则此排序不是稳定排序。
  • @adsmith:对于这样的任务,zip 更有意义,如果你认为它可以被称为transpose
【解决方案2】:

其他答案演示了如何在一行中完成。这个答案说明了它是如何工作的:

给定一个listl

In [1]: l =  [['J', 'A', 'M', 'E', 'S'],
   ...:  ['F', 'C', 'A', 'A', 'A'],
   ...:  ['F', 'A', 'B', 'B', 'B']]

通过将每一行传递给zip(),将列分组到tuples:

In [2]: zip(*l)
Out[2]: 
[('J', 'F', 'F'),
 ('A', 'C', 'A'),
 ('M', 'A', 'B'),
 ('E', 'A', 'B'),
 ('S', 'A', 'B')]

list 中的tuples 排序:

In [3]: sorted(zip(*l))
Out[3]: 
[('A', 'C', 'A'),
 ('E', 'A', 'B'),
 ('J', 'F', 'F'),
 ('M', 'A', 'B'),
 ('S', 'A', 'B')]

请注意,如果第一个列表包含重复项,则此排序不是稳定排序。

再次转置list,得到tuples中的三个lists

In [4]: zip(*sorted(zip(*l)))
Out[4]: 
[('A', 'E', 'J', 'M', 'S'),
 ('C', 'A', 'F', 'A', 'A'),
 ('A', 'B', 'F', 'B', 'B')]

listtuples 转换回listlists,使用list comprehension

In [5]: [list(t) for t in zip(*sorted(zip(*l)))]
Out[5]: 
[['A', 'E', 'J', 'M', 'S'],
 ['C', 'A', 'F', 'A', 'A'],
 ['A', 'B', 'F', 'B', 'B']]

【讨论】:

  • 您可以使用sorted(zip(*l), key = operator.itemgetter(0)使排序稳定。
【解决方案3】:
>>> l = [['J', 'A', 'M', 'E', 'S'],
...  ['F', 'C', 'A', 'A', 'A'],
...  ['F', 'A', 'B', 'B', 'B']]
>>> zip(*sorted(zip(*l)))
[('A', 'E', 'J', 'M', 'S'), ('C', 'A', 'F', 'A', 'A'), ('A', 'B', 'F', 'B', 'B')]

如果您需要结果列表:

>>> map(list, zip(*sorted(zip(*l))))
[['A', 'E', 'J', 'M', 'S'], ['C', 'A', 'F', 'A', 'A'], ['A', 'B', 'F', 'B', 'B']]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    • 2014-02-08
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多