从文件创建列表并查找最大值

时间:2017-06-30 04:45:29

标签: python python-3.x

file = open('data.txt') 
data = [] 

h = [i[:-1] for i in file] 

def maximum_cols(list):
    for line in h:
        data.append(line)
y = [int(n) for n in data]

    x = None
    for value in data:
        value = int(value)
        if not x: 
            x = value 
        elif value > x:
            x = value
    return x
maximum_cols(data)
print(data)    

所以我试图将文件读入2d列表,然后从列表中找到最大值并将其打印出来。我好丢失,陷入困境。我不知道该怎么办。这是我制作的代码。我很确定我的编码中有一些错误。我是python的新手,我需要帮助

Data.txt:

的内容
13 45 44 98 1 17 4
2 0 1 3 1 1 1

DataFile

Code's; Errors

6 个答案:

答案 0 :(得分:0)

首先,当你打电话给maximum_cols(data)时,你没有变量,然后打印出同样的data,即2d列表,所以你甚至不打印最大

其次,从文件中获取列表本身存在一些问题,您必须先拆分每一行。

myfile = open('data.txt') # don't use the word file as a variable
data = [line.rstrip().split() for line in myfile]
myfile.close() # very important to close files after we use them

使用rstrip()我们得到的所有行都没有换行符,并且没有变得丑陋的[:-1]这是不可读的且非常容易破解(rstrip只是为了那个)然后split()行到data得到每个项目

请注意,def max2d(data): return max(int(x) for line in data for x in line) 现在已经是你想要的2-d列表,但仍然是字符串而不是整数,现在我们可以使用内置最大函数和一些花哨的列表理解来获得最大值,这可以是用一行函数完成:

mymax = max2d(data)
print(mymax)

然后你只需要使用该功能并打印输出:

myfile = open('data.txt') # don't use the word file as a variable
data = [line.rstrip().split() for line in myfile]
myfile.close() # very important to close files after we use them

def max2d(data):
    return max(int(x) for line in data for x in line)

mymax = max2d(data)
print(mymax)

一切都在一起:

case .success(let upload, _, _):
                upload.response { [weak self] response in
                    guard self != nil else {
                        return
                    }
                    debugPrint(response)
                }
                upload.responseJSON {  response in
                    print(response)
                //    let responseJSON = response.result.value as! NSDictionary
                  //  print(responseJSON)
                 DispatchQueue.main.async {
                   self.tableview.reloadData()
                  }
                }

正如你所看到的那样,我允许自己打破你的风格,因为我认为学习更“pythonic”的方式会更好...希望有所帮助

答案 1 :(得分:0)

您现有代码的最大问题(除了奇怪的缩进和一些低效率)是您永远不会将当前行拆分为数字以用于比较。

您要实现的目标相对简单 - 按照您的逻辑,您可以分离文件加载/ 2D列表生成并实际找到列表中的最大值:

def get_data(filename):
    with open(filename, "r") as f:  # open the file
        return [list(map(int, x.split())) for x in f]  # generate the 2D integer table

def get_max_value(data):
    return max(max(x) for x in data)  # get maximum value out of all maximums of each row

然后您可以将其测试为:

your_data = get_data("data.txt")  # your 2D list
# e.g. [[13, 45, 44, 98, 1, 17, 4], [2, 0, 1, 3, 1, 1, 1]]
max_value = get_max_value(your_data)  # the maximum value 
# e.g. 98

答案 2 :(得分:0)

我以更简单的方式重写了代码。试试看吧。它有效:

file = open('data.txt') 
data = [] 

data = [i[:-1] for i in file]

def maximum_cols():

    max = 0 
    for line in data:
        x = line.split(' ')
        for num in x:
            if(num > max):
                max = num
    return max

print(maximum_cols())

我已经使用了大部分变量命名。但我只是试着让它更短更容易理解。这是你在找什么?

编辑:

file = open('data.txt') 
data = [] 

data = [i[:-1] for i in file]

def maximum_cols():

    max = 0 
    for line in data:
        x = line.split(' ')
        for num in x:
            if(num > max):
                max = num
    for line in data:
        if max in line:
            return line

print(maximum_cols())

尝试查看额外的for循环是否适合您。

编辑2:

尝试使用方括号:

file = open('data.txt') 
data = [i[:] for i in file]

def maximum_cols():
    max = 0 
    for line in data:
        x = line.strip().split(' ')
        for num in x:
            if(int(num) > max):
                max = int(num)
    for line in data:
        if str(max) in line:
            return ('[' + line.strip() + ']')

print(maximum_cols())

希望它有效! :)

答案 3 :(得分:0)

你可以这样做

    data = [] 
    with open('pytext.txt','rb') as f:
        line = f.read().splitlines()

    for i in line:
        data =  i.split(' ')
        str_list = map(lambda x: x.strip(), data)
        mylist =   [int(i) for i in str_list if i]
        print max(mylist)

答案 4 :(得分:0)

我建议你一个更简单的方法。使用列表推导

<强> DATA.TXT

13 45 44 98 1 17 4
2 0 1 3 1 1 1

在此代码中查看

ff = open("data.txt","r+")
flist = ff.readlines()
flist = [item.split() for item in flist]
flist = [int(x) for sub_list in flist for x in sub_list]
print(max(flist))

输出:

98

现在,您的flist = ff.readlines()只读取每一行,并将每一行存储为列表。它的输出将是,

['13 45 44 98 1 17 4\n', '2 0 1 3 1 1 1\n']

现在是第一个列表理解,

flist = [item.split() for item in flist]

以上行将这些行拆分为单独的数字。输出就是这个,

[['13', '45', '44', '98', '1', '17', '4'], ['2', '0', '1', '3', '1', '1', '1']]

最终列表理解

flist = [int(x) for sub_list in flist for x in sub_list]

只需将extends合并所有这些项目放入一个列表中,然后将其更改为int。它的输出将是,

[13, 45, 44, 98, 1, 17, 4, 2, 0, 1, 3, 1, 1, 1]

最后,只需使用内置max()函数即可获得列表的最大值。

max(flist)

看看它有多简单。但是,如果您希望在特定代码中解决问题,请查看其他解决方案。我刚刚提到了一个更简单的方法

答案 5 :(得分:0)

分割并映射到heapq后,只需使用int来存储这些行。您可以使用nlargest仅根据哪个包含最高值来输出最大的条目。

from heapq import heappush, nlargest

with open('data.txt') as f:
    heap = []
    for line in f:
        heappush(heap, map(int, line.split()))

    print(nlargest(1, heap, key=max)[0])

输出:

[13, 45, 44, 98, 1, 17, 4]

如果您只想要所有列表中的单个最大值(不确定是否这样做),请使用itertools.chain.from_iterable将2d列表展平为单个iterable并获取max

from itertools import chain

with open('data.txt') as f:
    mval = max(chain.from_iterable(map(int,line.split()) for line in f))

    print(mval)