Python 我如何按字母顺序重新排列?

Python 我如何按字母顺序重新排列?,python,Python,我想按字母顺序重新排列一个文件。我还想把号码印在安排好的信旁边 e、 g: 这是我的密码: f = open("1.txt","r") r = f.read() print(r) r=r.split() line=sorted(r) for row in line: print(line) 下面是我得到的结果: f 2 c 5 e 6 a 4 ['2', '4', '5', '6', 'a', 'c', 'e', 'f'] ['2', '4', '5', '6', 'a', 'c',

我想按字母顺序重新排列一个文件。我还想把号码印在安排好的信旁边

e、 g:

这是我的密码:

f = open("1.txt","r")
r = f.read()
print(r)
r=r.split()

line=sorted(r)
for row in line:
    print(line)
下面是我得到的结果:

f 2
c 5
e 6
a 4
['2', '4', '5', '6', 'a', 'c', 'e', 'f']
['2', '4', '5', '6', 'a', 'c', 'e', 'f']
['2', '4', '5', '6', 'a', 'c', 'e', 'f']
['2', '4', '5', '6', 'a', 'c', 'e', 'f']
['2', '4', '5', '6', 'a', 'c', 'e', 'f']
['2', '4', '5', '6', 'a', 'c', 'e', 'f']
['2', '4', '5', '6', 'a', 'c', 'e', 'f']
['2', '4', '5', '6', 'a', 'c', 'e', 'f']
>>> 

要获取文件对象上的子列表
map
str.split
中的对,并对其进行排序,请执行以下操作:

with open("in.txt") as f:
    print(sorted(map(str.split,f)))
in.txt:

e 6
c 5
f 2
a 4
输出:

[['a', '4'], ['c', '5'], ['e', '6'], ['f', '2']]
OrderedDict([('bar', deque([4, 5, 6], maxlen=3)), ('foo', deque([1, 2, 3], maxlen=3)), ('homer', deque([2], maxlen=3))])
OrderedDict([('bar', deque([4, 5, 6], maxlen=3)), ('foo', deque([2, 3, 100], maxlen=3)), ('homer', deque([2], maxlen=3))])
OrderedDict([('bar', deque([4, 5, 6], maxlen=3)), ('foo', deque([2, 3, 100], maxlen=3)), ('homer', deque([2], maxlen=3))])
要按字母顺序对文件进行排序,只需在文件对象上调用sorted即可:

with open("test.txt") as f:
    print(sorted(f))
如果要格式化输出,请执行以下操作:

with open("test.txt") as f:
    for sub in sorted(map(str.split,f)):
        print("letter = {}, num = {}".format(*sub))

letter = a, num = 4
letter = c, num = 5
letter = e, num = 6
letter = f, num = 2
另外,您之所以会看到
['2','4','5','6','a','c','e','f']
是因为调用split on.read会将所有数据拆分为一个单独的列表作为split,在任何空格上拆分,并且当按字典顺序将字符串数字与字母数字进行比较时,数字被认为较低,因此2int的数字时,在排序列表中
11
之前会出现
100
,因为
1
被视为大于
0
100,所以在比较字符串数字时也要小心

如果您希望每个用户最多有三个分数始终保留最新的分数,您可以使用
deque
maxlen
为3的
pickle
初始排序后的dict

from csv import reader
from collections import deque, OrderedDict
import pickle
name, new_score = "foo",100
with open("test.txt") as f:
    d = OrderedDict((name, deque(map(int,rest),maxlen=3)) for name, *rest in reader(sorted(f)))
    print(d)
    d[name].append(new_score)
    print(d)

with open("my_data.pkl","wb") as out:
    pickle.dump(d, out)


with open("my_data.pkl","rb") as out:
    print(pickle.load(out))
test.txt:

homer,2
foo,1,2,3
bar,4,5,6
输出:

[['a', '4'], ['c', '5'], ['e', '6'], ['f', '2']]
OrderedDict([('bar', deque([4, 5, 6], maxlen=3)), ('foo', deque([1, 2, 3], maxlen=3)), ('homer', deque([2], maxlen=3))])
OrderedDict([('bar', deque([4, 5, 6], maxlen=3)), ('foo', deque([2, 3, 100], maxlen=3)), ('homer', deque([2], maxlen=3))])
OrderedDict([('bar', deque([4, 5, 6], maxlen=3)), ('foo', deque([2, 3, 100], maxlen=3)), ('homer', deque([2], maxlen=3))])
排序后,您只需加载即可获得dict并在写入后转储。

您需要使用readlines()而不是read()将文件的每一行作为列表中的一个单独元素来获取。然后,一个简单的列表就可以了

f = open('1.txt','r')

# Use readlines isntead of of read to get an list of lines
lines = f.readlines()
print ''.join(lines)

# Now sort the list (default is by first letter
lines.sort()
print ''.join(lines)
或者,您可以强制拆分函数使用行尾字符'\n',而不是默认值(全部为空白)。但是现在您需要使用新行char('\n')而不是空字符串将列表连接回来

f = open('1.txt','r')
lines = f.read()
lines = lines.split('\n')
print '\n'.join(lines)

# Now sort the list (default is by first letter
lines.sort()
print '\n'.join(lines)

我的代码的顶部有点混乱,我是这个websire sry的新手。我想你的意思是“行中的行:打印(行)而不是
打印(行)
;你的其他问题已在答案中解决。谢谢,伙计,这就是我需要的。我还想问你另一个问题,我有另一个程序写入此文本文件,我想将3个数字保存到一个字母中,我该怎么做????再一次谢谢你是说再加两个数字吗?是一行还是两行?我无意中按了回车键。你是在添加现有数据还是在创建全新的数据?