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

时间:2015-09-27 21:16:51

标签: python

我想按字母顺序重新排列文件。此外,我希望在排列的信件旁边打印号码。

e.g:

a 4
c 5
e 6
f 2

这是我的代码:

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

2 个答案:

答案 0 :(得分:2)

要获取文件对象上的子列表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']]

要按字母顺序对文件进行排序,只需获取您在文件对象上调用的行:

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']是因为在.read上调用split将所有数据拆分为单个列表作为split,在任何空格上拆分,并且当按字典顺序将字符串数字与字母数字进行比较时,数字被认为是较低的,因此2< a,当你将字符串数字相互比较为11 > 100 = True时要小心,因为字符串逐字符比较1被认为大于0 100会出现在11之前在排序列表中,比较投射到int的数字。

如果您希望每个用户最多保留三个分数,请始终保持最新状态,您可以使用deque maxlen为3,并在初始排序后pickle字典。

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

输出:

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

一旦排序,您只需要在写完之后加载以获取字典和转储。

答案 1 :(得分:0)

您需要使用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)