如何对附有名称的数字列表进行排序?

时间:2015-04-24 10:59:24

标签: python sorting

我的代码旨在从文本文件中提取数据并将其添加到列表中。我已经使用.sort()按字母顺序对其进行了排序。但是,我不能用数字对数据进行排序,因为它是数字和字母的混合。

list2=[]
list2=open('list_data2.txt').readlines()
list2.sort()
print (list2)

我的文字文件说:

Bob,two,4,5,2
Gerald,five,6,9,3
Abby,one,4,1,9

3 个答案:

答案 0 :(得分:1)

您需要单独对元素进行排序:

l2=[]
with open('list_data2.txt') as f:
  for line in f:
   l=line.strip().split(',')
   l2.append(sorted(l[:2])+sorted(l[2:],reverse=True))

print l2

结果:

[['Bob', 'two', '5', '4', '2'], 
 ['Gerald', 'five', '9', '6', '3'], 
 ['Abby', 'one', '9', '4', '1']]

您也可以加入结果:

for i in l2:
  print ','.join(i)

Bob,two,5,4,2
Gerald,five,9,6,3
Abby,one,9,4,1

在这种情况下,我们不是按字母顺序对数字进行排序,因为@Padraic Cunningham说数字长度超过1会失败。在这种情况下,您需要将数字列表元素转换为int然后排序:

l2=[]
with open('list_data2.txt') as f:
  for line in f:
   l=line.strip().split(',')
   l2.append(sorted(l[:2])+sorted(map(int,l[2:]),reverse=True))

print l2

答案 1 :(得分:0)

我想你想按最后三个数字字段之一排序。

# this sorts by the value of the third field
list2.sort(key=lambda x: int(x.split(',')[2]))

编辑:如果您想按相反顺序排序,只需添加reverse=True

list2.sort(key=lambda x: int(x.split(',')[2]), reverse=True)

答案 2 :(得分:0)

如果要更改原始文件,请使用csv模块获取行并写入NamedTemporaryFile,然后使用shutil.move将旧文件替换为更新的文件:

import csv
from tempfile import NamedTemporaryFile
from shutil import move

with open('in.txt') as f, NamedTemporaryFile("w",delete=False, dir=".") as out:
    r, wr = csv.reader(f), csv.writer(out)
    for row in r:
        wr.writerow(row[:2] + sorted(row[2:], key=int,reverse=True))
move(out.name,"in.txt")

输出:

Bob,two,5,4,2
Gerald,five,9,6,3
Abby,one,9,4,1

如果您未通过密钥,则int "11"将被视为< "2",您需要排序为整数而不是字符串。

或者fileinput.input使用inplace=True

import fileinput

for line in fileinput.input("in.txt", inplace=True):
    row = line.strip().split(",")
    print(",".join((row[:2]+sorted(row[2:], key=int, reverse=True)),end=""))