3

样本输入

20, 71146620
100, 26867616
10, 02513583
10, 52811698
100, 23859051

我从文件中将其作为命令行参数读入到列表中

lin = [i.strip() for i in open(sys.argv[1]).readlines()]

该列表看起来像['20, 71146620', '100, 26867616', '10, 02513583', '10, 52811698', '100, 23859051']

我希望找到最pythonic的方式来排序这个列表,首先是第一个值,然后是第二个值,这样它看起来像:

['10, 02513583', '10, 52811698', '20, 71146620', '100, 23859051', '100, 26867616', ]

我目前正在尝试将其转换为键值对列表,但我不确定这是正确的方向。

4

4 回答 4

4

最简单的做法是将这些对解析为列表,然后对它们进行排序:

lin = [i.strip().split(', ') for i in open(sys.argv[1]).readlines()]
lin = sorted(lin)

如果您想按数字排序,只需转换为数字:

lin = [map(int, i.strip().split(', ')) for i in open(sys.argv[1]).readlines()]
lin = sorted(lin)
于 2013-10-14T04:44:17.340 回答
2

您可以使用键函数将行排序为字符串

def two_ints(s):
    return map(int, s.split(","))

with open("num.txt") as f:
    for line in sorted(f, key=two_ints):
        print line

这实际上取决于您希望结果是字符串列表还是整数列表列表。

一旦转换为 int,就无法恢复“02513583”上的前导零,因此将结果保留为字符串可能更可取

于 2013-10-14T05:09:50.030 回答
1
import sys
with open(sys.argv[1]) as f:
    lin = sorted([[int(j) for j in i.split(",")] for i in f])
print lin
于 2013-10-14T04:45:11.170 回答
0

为什么不只使用 csv 模块并将其提供给排序(使用字符串到整数转换)

import csv

with open("test.csv") as f:
    cr = csv.reader(f)
    result = sorted(list(map(int,row)) for row in cr)

结果:

>>> result
[[10, 2513583],
 [10, 52811698],
 [20, 71146620],
 [100, 23859051],
 [100, 26867616]]

sort完全按照这里的要求做:它使用列表的自然排序顺序

于 2018-11-10T09:47:08.367 回答