我有两个文件,file1和file2,按第2列数字排序:
文件1
A 1
B 10
file2的
C 2
D 100
我想合并它们并得到这个输出,它也按第2列数字排序:
D 1
B 2
C 10
A 100
我可以使用这个unix命令来完成它,它不会排序,但会合并预先排序的文件:
sort -m -k2n,2 file1 file2
但是如何在没有将文件读入内存且没有排序的情况下在Python 3.4中执行此操作? Python 3.5将根据docs.python.org,bugs.python.org和github.com向heapq.merge()添加一个关键参数,但不提供预发布。与此同时,我想出了下面的解决方案。有更优雅的方式吗?我可以使用map并循环使用这两个文件吗?也许我应该发布到codereview呢?
import heapq
def key_generator(fd):
for line in fd:
yield int(line.split()[1]), line
with open('file1') as fd1, open('file2') as fd2:
it1 = key_generator(fd1)
it2 = key_generator(fd2)
for key, line in heapq.merge(it1, it2):
print(line, end='')
答案 0 :(得分:1)
我刚刚下载了Python3.5的alpha版本1,我可以使用key function的新heapq.merge()来完成它:
from heapq import merge
def keyfunc(s):
return int(s.split()[1])
with open('file1') as fd1, open('file2') as fd2:
for line in merge(fd1, fd2, key=keyfunc):
print(line)
或者那些喜欢一行lambda函数的人:
key=lambda line: int(line.split()[1])
我可以使用map,operator.itemgetter(),str.split和int在一行中完成此操作吗?
答案 1 :(得分:-2)
你可以试试这种方式
dict={}
with open("a.txt",'r') as f1, open("b.txt",'rb') as f2:
lines_a=f1.readlines()
lines_b=f2.readlines()
for line in lines_a:
dict.update({line.split()[0]:int(line.split()[1])})
for line in lines_b:
dict.update({line.split()[0]:int(line.split()[1])})
for w in sorted(dict, key=dict.get):
print w,(dict[w])