Найти - Пользователи
Полная версия: выбор наибольшего числа , python-way
Начало » Python для новичков » выбор наибольшего числа , python-way
1
Senhion
Доброго времени суток.
Необходимо сравнить первые 4 столбца и вывести номер столбца который содержит наибольшее число.
Решаю задачу в лоб:

Входной файл double_table.txt:
in1;in2;in3;in4;out1;out2;out3;out4
1;0;0;0;1;0;0;0
0;1;0;0;0;1;0;0
0;0;1;0;0;0;1;0
0;0;0;1;0;0;0;1

код:
import csv
f = open("C:\\Temp\\double_table.txt","r")
table = []
for row in csv.reader(f,delimiter=';'):
    table.append(row)
f.close()
out_1 = []
for row in table[1:]:
    if row[0]>row[1] and row[0]>row[2] and row[0]>row[3] : out_1.append("1")
    if row[1]>row[0] and row[1]>row[2] and row[1]>row[3] : out_1.append("2")
    if row[2]>row[1] and row[2]>row[0] and row[2]>row[3] : out_1.append("3")
    if row[3]>row[1] and row[3]>row[2] and row[3]>row[0] : out_1.append("4")
print out_1

после for я понимаю у меня идет говнокод , как правильно это сделать на питоне?
reclosedev
Например так:
import csv
import operator
 
with open("double_table.txt", 'rb') as f:
    reader = csv.reader(f, delimiter=';')
    reader.next()
    for row in reader:
        index, value = max(enumerate(row[:4]), key=operator.itemgetter(1))
        print index

Если индекс должен с 1 начинаться, то нужно заменить на
index, value = max(enumerate(row[:4], 1), key=operator.itemgetter(1))
Senhion
Спасибо за ответ.

Но разбирая пример ни как не могу понять для чего используется:
key=operator.itemgetter(1)
, точнее что откуда он берет и что куда возвращает?

Могу предположить что после enumerate мы имеем что-то вроде:
 [(0, 1), (1, 0), (2, 0), (3, 0)]
а соответсвенно operator.itemgetter(1) возвращает в max:
[1,0,0,0]
но тогда почему max возвращает index элемента?

UPD:
max(enumerate([1,0,0,0]),key = operator.itemgetter(1))
очевидно вернул…
(0, 1)

тогда не понятно где в docs указывается что max возвращает индекс и значение, а не только значение?

 max(iterable[, args...][key])
    With a single argument iterable, return the largest item of a non-empty iterable (such as a string, tuple or list). With more than one argument, return the largest of the arguments.
    The optional key argument specifies a one-argument ordering function like that used for list.sort(). The key argument, if supplied, must be in keyword form (for example, max(a,b,c,key=func)).

в ООП новичек - поэтому буду благодарен если укажете на ошибки в определениях.


Ну и еще вопрос по синтаксису: чем чтение из файла
with open("double_table.txt", 'rb') as f:
    reader = csv.reader(f, delimiter=';')
правильнее
f = open("C:\\Temp\\double_table.txt","r")
table = []
for row in csv.reader(f,delimiter=';'):
    table.append(row)
f.close()
?
FishHook
>>> a=[(1,2),(3,4)]
>>> max(a)
(3, 4)
>>> a=[(1,5),(3,4)]
>>> max(a)
(3, 4)
>>> max(a, key=lambda x: x[1])
(1, 5)
>>> 
В данном случае
key=lambda x: x[1]
аналогично
key = operator.itemgetter(1)
, то есть указывает функции по какому из элементов вложенных в список кортежей производить сравнение
FishHook
Senhion
Ну и еще вопрос по синтаксису: чем чтение из файла
with open("double_table.txt", 'rb') as f:
    reader = csv.reader(f, delimiter=';')
правильнее
f = open("C:\\Temp\\double_table.txt","r")
table = []
for row in csv.reader(f,delimiter=';'):
    table.append(row)
f.close()
?

http://softwaremaniacs.org/blog/2006/09/19/with-in-python-25/
reclosedev
Senhion
тогда не понятно где в docs указывается что max возвращает индекс и значение, а не только значение?
max возвращает максимальный элемент из списка. С индексом это не связано.
>>> max([(1, 1), (1, 5), (2, 1)])
(2, 1)

Senhion
а соответсвенно operator.itemgetter(1) возвращает в max:
Проще показать как примерно используется аргумент key в max() (естественно здесь много чего не учитывается и нет проверок):
def my_max(elements, key=lambda x: x):
    it = iter(elements)
    max_el = it.next()
    max_key = key(max_el)
    for el in it:
        el_key = key(el)
        if el_key > max_key:
            max_el = el
            max_key = el_key
    return max_el
 
# а это примерно то, что возвращает operator.itemgetter(1)
def itemgetter_1(some_list):
    return some_list[1]
 
elements = [1, 0, 0, 0]
print list(enumerate(elements))  # [(0, 1), (1, 0), (2, 0), (3, 0)]
print my_max(enumerate(elements))  # (3, 0)
print my_max(enumerate(elements), itemgetter_1)  # (0, 1)

Senhion
Ну и еще вопрос по синтаксису: чем чтение из файла … правильнее
При выходе из блока with, даже в случае исключения, файл гарантированно закроется. Да и просто удобнее.
А то, что у меня в коде значения не сохраняются в списке - просто для сокращения.
doza_and
еще вариант:
import numpy as np
aa=np.genfromtxt(nm,skip_header=1,delimiter=';')
print np.argmax(np.max(aa[:,:4],axis=0))
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB