Как найти минимальные / максимальные значения из строк и столбцов в Python? - PullRequest
1 голос
/ 22 октября 2011

Мне было интересно, как найти минимальное и максимальное значения из набора данных, который в основном представляет собой текстовый файл.В нем 50 строк, 50 столбцов.

Я знаю, что могу настроить цикл управления (чтобы цикл был конкретным), чтобы он читал каждую строку и столбец и определял минимальное / максимальное значения.Но я не уверен, как это сделать.

Я думаю, что сначала нужно преобразовать строки и столбцы в список, а затем мне нужно использовать функцию split().Я попытался настроить что-то следующим образом, но это не сработало:

for x in range(4,50): # using that range as an example
    x.split()
    max(4,50)
    print x

Новое в Python.Пожалуйста, извините за мои ошибки.

Ответы [ 4 ]

3 голосов
/ 22 октября 2011

Попробуйте что-то вроде этого:

data = []
with open('data.txt') as f:
    for line in f:                   # loop over the rows
        fields = line.split()        # parse the columns
        rowdata = map(float, fields) # convert text to numbers
        data.extend(rowdata)         # accumulate the results
print 'Minimum:', min(data)
print 'Maximum:', max(data)

Обратите внимание, что split () принимает необязательный аргумент, если вы хотите разделить что-то, кроме пробелов (например, запятые).

3 голосов
/ 22 октября 2011

Если файл содержит обычную (прямоугольную) матрицу и вы знаете, сколько строк в нем содержится информации заголовка, вы можете пропустить информацию заголовка и использовать NumPy , чтобы сделать это особенно легко:1003 *

import numpy as np

f = open("file.txt")
# skip over header info
X = np.loadtxt(f)
max_per_col = X.max(axis=0)
max_per_row = X.max(axis=1)
2 голосов
/ 22 октября 2011

Хммм ... Вы уверены, что здесь не применимо? ;) Независимо от того:

Вам нужно не только разбить строки ввода, вам нужно преобразовать текстовые значения в числа. Итак, если вы прочитали строку ввода в in_line, вы бы сделали что-то вроде этого:

...
row = [float(each) for each in in_line.split()]
rows.append(row) # assuming you have a list called rows
...

Когда у вас есть список строк, вам нужно получить столбцы:

...
columns = zip(*rows)

Затем вы можете просто перебирать каждую строку и каждый столбец, вызывая max ():

...
for each in rows:
    print max(each)
for eac in columns:
    print max(each)

Редактировать: Вот более полный код, показывающий, как открыть файл, выполнить итерацию по строкам файла, закрыть файл и использовать приведенные выше подсказки:

in_file = open('thefile.txt', 'r')

rows = []
for in_line in in_file:
    row = [float(each) for each in in_line.split()]
    rows.append(row)

in_file.close() # this'll happen at the end of the script / function / method anyhow

columns = zip(*rows)

for index, row in enumerate(rows):
    print "In row %s, Max = %s, Min = %s" % (index, max(row), min(row))

for index, column in enumerate(columns):
    print "In column %s, Max = %s, Min = %s" % (index, max(column), min(column))

Редактировать: Для блага новой школы, не используйте мою старую, рискованную обработку файлов. Используйте новую, безопасную версию:

rows = []
with open('thefile.txt', 'r') as in_file:
    for in_line in in_file:
        row = ....

Теперь у вас есть много гарантий, что вы случайно не сделаете что-то плохое, например, оставите этот файл открытым, даже если вы выбросите исключение во время чтения. Кроме того, вы можете полностью пропустить in_file.close(), не чувствуя себя даже немного виноватым.

1 голос
/ 22 октября 2011

Будет ли это работать для вас?

infile = open('my_file.txt', 'r')
file_lines = file.readlines(infile)

for line in file_lines[6:]:
    items = [int(x) for x in line.split()]
    max_item = max(items)
    min_item = min(items)
...