Форум сайта python.su
Доброго времени суток.
Необходимо сравнить первые 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
Отредактировано Senhion (Авг. 20, 2012 16:06:25)
Офлайн
Например так:
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
index, value = max(enumerate(row[:4], 1), key=operator.itemgetter(1))
Отредактировано reclosedev (Авг. 20, 2012 16:27:04)
Офлайн
Спасибо за ответ.
Но разбирая пример ни как не могу понять для чего используется:
key=operator.itemgetter(1)
[(0, 1), (1, 0), (2, 0), (3, 0)]
[1,0,0,0]
max(enumerate([1,0,0,0]),key = operator.itemgetter(1))
(0, 1)
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)
Офлайн
>>> 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)
Офлайн
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()
Офлайн
Senhionmax возвращает максимальный элемент из списка. С индексом это не связано.
тогда не понятно где в docs указывается что max возвращает индекс и значение, а не только значение?
>>> max([(1, 1), (1, 5), (2, 1)]) (2, 1)
SenhionПроще показать как примерно используется аргумент key в max() (естественно здесь много чего не учитывается и нет проверок):
а соответсвенно operator.itemgetter(1) возвращает в 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)
Офлайн
еще вариант:
import numpy as np aa=np.genfromtxt(nm,skip_header=1,delimiter=';') print np.argmax(np.max(aa[:,:4],axis=0))
Офлайн