我想按字母顺序重新排列文件。此外,我希望在排列的信件旁边打印号码。
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']
>>>
答案 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)