Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 20, 2012 16:04:09

Senhion
Зарегистрирован: 2012-08-13
Сообщения: 37
Репутация: +  0  -
Профиль   Отправить e-mail  

выбор наибольшего числа , python-way

Доброго времени суток.
Необходимо сравнить первые 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 я понимаю у меня идет говнокод , как правильно это сделать на питоне?

Отредактировано Senhion (Авг. 20, 2012 16:06:25)

Офлайн

#2 Авг. 20, 2012 16:24:31

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

выбор наибольшего числа , python-way

Например так:

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))

Отредактировано reclosedev (Авг. 20, 2012 16:27:04)

Офлайн

#3 Авг. 21, 2012 10:18:17

Senhion
Зарегистрирован: 2012-08-13
Сообщения: 37
Репутация: +  0  -
Профиль   Отправить e-mail  

выбор наибольшего числа , python-way

Спасибо за ответ.

Но разбирая пример ни как не могу понять для чего используется:

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()
?

Отредактировано Senhion (Авг. 21, 2012 10:40:21)

Офлайн

#4 Авг. 21, 2012 11:16:59

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

выбор наибольшего числа , python-way

>>> 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 (Авг. 21, 2012 11:20:34)

Офлайн

#5 Авг. 21, 2012 11:20:01

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

выбор наибольшего числа , python-way

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/



Офлайн

#6 Авг. 21, 2012 11:32:44

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

выбор наибольшего числа , python-way

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, даже в случае исключения, файл гарантированно закроется. Да и просто удобнее.
А то, что у меня в коде значения не сохраняются в списке - просто для сокращения.

Отредактировано reclosedev (Авг. 21, 2012 11:35:30)

Офлайн

#7 Авг. 23, 2012 23:24:31

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

выбор наибольшего числа , python-way

еще вариант:

import numpy as np
aa=np.genfromtxt(nm,skip_header=1,delimiter=';')
print np.argmax(np.max(aa[:,:4],axis=0))



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version