2015-08-28 83 views
0

我发送这个是因为我被一个代码所困扰,我呆了整整一天的时间才得到它。如何在.txt文件中找到最高值?

这是一个Python中的程序,它读取一个带有大量浮点值(1亿+)的.txt文件,并从中获取最高和最低值。

我有很多问题,第一个说我无法将字符串转换为浮点数来比较值。

而新代码不显示值。

一些细节:

  • 线具有多个值,我试着用拆分带他们。
  • 所有的数字是浮点

下面的代码:

with open('gmm_data.txt') as f: 
    array = [] 
    minim = 99999999999999 
    maxim = -99999999999999 
    for line in f: # read rest of lines 
     array.append([float(x) for x in line.split()]) 
    if(array[0] > maxim): 
     maxim = array[0] 
    elif(array[0] < minim): 
     minim = array[0] 

print (maxim) 
print (minim) 
+2

你能提供输入和你的输入是 – The6thSense

回答

1

这里有一个很好的清洁方法来做到这一点:

def min_and_max(iterable): 
    iterator = iter(iterable) 

    # Assumes at least two items in iterator 
    minim, maxim = sorted((next(iterator), next(iterator))) 

    for item in iterator: 
     if item < minim: 
      minim = item 
     elif item > maxim: 
      maxim = item 

    return (minim, maxim) 


with open('gmm_data.txt', 'r') as f: 
    values = (float(value_str) for line in f for value_str in line.split()) 
    minim, maxim = min_and_max(values) 

print(maxim) 
print(minim) 

记住,float的可能是不准确的;如果您需要数字更准确,请考虑使用decimal.Decimal()

0

看起来好像是你比较步骤你要访问您的阵列的最后元素(因为这是新值是append ed;这是在Python中用array[-1]实现的

1

你说你的文件中有超过百万个浮点值,如果是这样的话你不应该将整个文件读入内存并将它们存储为浮点数。

相反,您应该阅读每一行,将所有的值在一行中转换为浮点数,然后尝试从中找到最大值/最小值,然后存储一个变量以表示文件中的最大和最小元素,并检查如果每条线的最大值和最小值大于/小于这些值并相应替换。

要进行初始化,可以将最大值初始化为float('-inf')。示例 -

with open('gmm_data.txt') as f: 
    maxf = float('-inf') 
    minf = float('inf') 
    for line in f: # read rest of lines 
     if line.strip(): 
      arr = [float(x) for x in line.split()]) 
      maxa = max(arr) 
      mina = min(arr) 
      if maxa > maxf: 
       maxf = maxa 
      if mina < minf: 
       minf = mina 
+0

如果线是空的,然后改编列表将是空多久的样品。当我们尝试查找列表的最大值或最小值时,它将返回“ValueError:max()arg是一个空序列”。 –

+0

@Igor,请在查找最大或最小值之前查看列表的长度。 –

+1

@DineshPundkar在我的代码中修正了它,在创建arr /取最大值/最小值之前检查'line.strip()'是否为空。 –

0

如果您阅读整个文件。您可以使用此方法。

代码:

def conversion(num): 
    try: 
     num=float(num) 
     return True 
    except Exception: 
     return False 

with open('a.txt') as f: 
    numbers=[float(num) for line in f for num in line.split() if conversion(num) ] 
minim = 99999999999999 
maximum= -99999999999999 
if numbers: 
    if max(numbers)>maximum: 
     maximum=max(numbers) 
    if min(numbers)<minim: 
     minim=min(numbers) 
print "maximum value:"+str(maximum) 
print "minimum value:"+str(minim) 

如果你的文件是非常large.Then你可以使用这个。

代码2:

def conversion(num): 
    try: 
     num=float(num) 
     return True 
    except Exception: 
     return False 

minim = 99999999999999 
maximum= -99999999999999 
with open('a.txt') as f: 
    for line in f: 
     numbers=[float(num) for num in line.split() if conversion(num) ] 
    if numbers: 
     if max(numbers)>maximum: 
      maximum=max(numbers) 
     if min(numbers)<minim: 
      minim=min(numbers) 
print "maximum value:"+str(maximum) 
print "minimum value:"+str(minim)