我很好奇,如果有喜歡的UNIX版本內置Python加入功能(參見http://linux.about.com/library/cmd/blcmdl_join.htm)。我知道這個功能是通過內置的sqlite3模塊來實現的,並且可能通過一些其他模塊,比如pytables。Python的「加入」類似Unix的功能「加入」
很抱歉,如果這是一個基本的問題,但我發現,搜索「蟒蛇加入」和相關查詢由標準Python加入功能相當污染。另外,如果沒有這樣的功能,我不會期望很容易地找到這些信息。
我很好奇,如果有喜歡的UNIX版本內置Python加入功能(參見http://linux.about.com/library/cmd/blcmdl_join.htm)。我知道這個功能是通過內置的sqlite3模塊來實現的,並且可能通過一些其他模塊,比如pytables。Python的「加入」類似Unix的功能「加入」
很抱歉,如果這是一個基本的問題,但我發現,搜索「蟒蛇加入」和相關查詢由標準Python加入功能相當污染。另外,如果沒有這樣的功能,我不會期望很容易地找到這些信息。
這裏的加入功能的Python版本,不處理所有潛在的錯誤情況。但是展示了基本的想法。
# usage join(open('f1.txt'), open('f2.txt'))
def join(fd_a, fd_b) :
result = []
la = fd_a.readline()
lb = fd_b.readline()
while la and lb :
start_a, rest_a = la.split(' ', 1)
start_b, rest_b = lb.split(' ', 1)
if cmp(start_a, start_b) == 0 :
result.append([start_a, [rest_a, rest_b]])
la = fd_a.readline()
lb = fd_b.readline()
elif cmp(start_a, start_b) < 0 :
la = fd_a.readline()
else :
lb = fd_b.readline()
return result
您可以方便地模擬聯接使用字典:
d1 = {"a": 1, "b": 2}
d2 = {"b": 3, "c": 4}
print dict((key, (d1[key], d2[key])) for key in d1 if key in d2)
{'b': (2, 3)}
或者,在Python 3.X的最後一行:
print {key: (d1[key], d2[key]) for key in d1.keys() & d2.keys()}
{'b': (2, 3)}
(2.x版本的也工作在Python 3。 x,但使用&
獲得字典鍵的交集可能會加快速度,如果只有一小部分d1
的鍵位於交叉點處)。
我不知道在單個函數調用中是否需要內置此功能。
如果是在Unix上運行的Python號,你可以在外部使用subprocess
模塊運行的命令。
+1因爲它看起來像一個很好的unix`join`模擬,包括文本文件中字段的隱式定義。 – martineau 2010-11-22 17:30:56