2013-05-30 65 views
1

這是剝離下來的代碼:爲什麼這個for循環乘以一切?

import itertools 

def Compare(file1, file2): 

    with open(file1+'.txt', 'r') as f1, open(file2+'.txt', 'r') as f2: 
     for line in itertools.product(f1, f2): 
      print (line), 

它將始終在總線所存在的數量打印出每一行。 因此,如果在特定的txt文件中總共有4行,它將每行打印4次,因此結果將是16行,其中12行是重複的。

回答

2

這就是itertools.product那樣 - 需要每個元素在a並在b所有元素對它。如果你想從每個文件的每一行配對,然後你想看看itertools.izip,如:

from itertools import product, izip 
from pprint import pprint 

a = ['a_one', 'a_two', 'a_three'] 
b = ['b_one', 'b_two', 'b_three'] 

pprint(list(product(a, b))) 
[('a_one', 'b_one'), 
('a_one', 'b_two'), 
('a_one', 'b_three'), 
('a_two', 'b_one'), 
('a_two', 'b_two'), 
('a_two', 'b_three'), 
('a_three', 'b_one'), 
('a_three', 'b_two'), 
('a_three', 'b_three')] 

pprint(list(izip(a, b))) 
[('a_one', 'b_one'), ('a_two', 'b_two'), ('a_three', 'b_three')] 

如果您打算比較文件,那麼值得看看filecmpdifflib模塊。

+0

你能否提供一個在這種情況下filecmp的簡單例子? – MaxPower

+1

@MaxPower在Python文檔和其他地方的代碼示例中有很多示例...我相信您可以找到滿足您需求的示例或提供合適的模板來處理 –

2

因爲itertools.product實質上是將兩個列表相乘。

documentation

笛卡兒積,相當於一個嵌套for循環

4行乘4行會是16行。