2017-07-19 62 views
1

我在文本文件中有以下類型的數據。如何從文本文件添加非零內容?

15 1 
23 0 
39 -1 
71 -1 
79 1 
95 1 
127 -2 
151 2 
183 1 
191 -1 
239 0 
247 3 

我想從文本文件中創建一個2d列表如下。我能夠做到這一點與下面給出結果如下

[[15, 1.36896146582243], 
[23, 0.000000000000000], 
[39, 0.848993860380692], 
[71, 0.629227476540724], 
[79, 0.596517662620081], 
[95, 0.543970127117099], 
[127, 1.88189324753006], 
[151, 1.72587115688942], 
[183, 0.391932527534896], 
[191, 0.383636720228727]] 

但是我不希望所有條目的代碼,我想只有那些在我的源文本文件中的第2列非零項。例如,我不想要條目

23 0 
239 0 

如何將條件語句添加到我的代碼中。

with open("path.text") as file: 
    R = [[int(x) for x in line.split()] for line in file] 
+0

'R = [[INT(X)爲X的line.split()用於在文件中的行是否 '0'不在line.split()]'中。 – Abdou

+0

@Abdou - 不會捕獲第一列中包含零的數字的行。 – zwer

+0

@Abdou這是真的不會捕獲第一列中包含零的數字的行嗎? – Kumarm

回答

2

沒有必要將其硬塞到一個列表理解表達 - 它不會更快,你的情況:

result = [] 
with open("path.text", "r") as f: 
    for line in f: 
     line = line.split() 
     if len(line) < 2: # just to make sure we have both columns 
      continue 
     column_2 = float(line[1]) # since, it appears, you have floats 
     if column_2: 
      result.append([int(line[0]), column_2]) # turn column 1 to int, too 

UPDATE - 基準時間 - 如果你定義功能密切相互匹配(因此沒有浮在處理或如上述驗證):

def f1(): 
    with open("path.text", "r") as f: 
     return [[int(x) for x in line.split()] for line in f if '0' not in line.split()] 

def f2(): 
    result = [] 
    with open("path.text", "r") as f: 
     for line in f: 
      line = line.split() 
      if line[1] != '0': 
       result.append([int(line[0]), int(line[1])]) 
    return result 

path.text包含相同的數據作爲在OP和assert f1() == f2()通行證,這裏有我的系統上的一些結果:

Python 3.5.1, 64-bit 
f1() - 100,000 loops: 10.834s 
f2() - 100,000 loops: 9.9601s 

Python 2.7.11 64-bit 
f1() - 100,000 loops: 6.9243s 
f2() - 100,000 loops: 6.4012s 

這其中大部分實際上是I/O,在處理不同的是,相對而言其實更大。

+0

你說我的情況下,列表理解表達式不會更快,但是你的方法需要更長的時間。 – Kumarm

+1

@Kumarm - 在上面找到一個快速基準 – zwer

+0

@Kumarm,不成熟的優化是萬惡之源。 –

1

甲Python的解決方案將是添加一個if語句來列表解析

 
with open("path.text") as file: 
    R = [[int(x) for x in line.split()] for line in file if line[1] != '0'] 
+0

非常感謝... – Kumarm