我的代码旨在从文本文件中提取数据并将其添加到列表中。我已经使用.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
答案 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=""))