用Pythonic的方式对逗号分隔的数字列表进行排序

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']

我的希望是找到最符合Python风格的方法,按照第一个值和第二个值的顺序对该列表进行排序,以便它看起来像:

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

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


记住两件事 - 1/ 标准字典每个键只有一个值,因此您将失去10:条目,2/ 标准字典无法“排序”。 因此,如果您的示例数据和输出正确,则键值对是错误的名称。 - Steve Barnes
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)

是的,我希望进行数字排序。谢谢你们两个。但愿我能选择两个都正确。 - frankV

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

这要看您希望结果是字符串列表还是整数列表。

一旦转换为整数,就无法恢复“02513583”前导零,因此将结果保留为字符串可能更好。


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

0
为什么不直接使用csv模块并将其提供给sort(带有字符串到整数转换)?
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 正好符合这里的要求:它使用列表的自然排序顺序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接