Уведомления

Группа в Telegram: @pythonsu

#1 Март 28, 2010 20:47:57

knkd
От:
Зарегистрирован: 2009-06-14
Сообщения: 225
Репутация: +  0  -
Профиль   Отправить e-mail  

с чего начать? хочу написать код

Скушно.
Начал было писать комментарии, но стало лениво. Так что дальше сами.

Файл ‘holyava.py’:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

def get_table(table):
# Раз колонкам всегда соответствует одна буква,
# то создадим по списку для каждой колонки.
col_a = []
col_b = []
col_c = []
col_d = []

# Пройдёмся циклом по _строкам_ файла 'table.csv'
for row in open(table, 'r'):
# Разделим строки на элементы.
row_list = row.split(';')
# Проигнорируем неправильные или пустые строки.
if len(row_list) >= 4:
# Положим каждое значение в соответствующий список.
col_c.append(float(row_list[0]))
col_a.append(float(row_list[1]))
col_d.append(float(row_list[2]))
col_b.append(float(row_list[3]))
# Объединяем значения колонок, в один кортеж.
# Их тоже, на всякий случай превращаем в кортеж.
data = (tuple(col_a), tuple(col_b), tuple(col_c), tuple(col_d))
return data

def get_input(infile):
data = []
# Пройдёмся циклом по _строкам_ файла 'input.csv'
for row in open(infile, 'r'):
# Разделим строки на элементы.
row_list = row.split(';')
# Кладём в список значение второго элемента строки,
# отрезая переводы строки.
row_list = row_list[1].strip()
data.append(row_list)
# Преобразовуем в кортеж.
data = tuple(data)
return data

def get_input_num(indata):
input_table = 'abcd'
new_data = []
for row in indata:
new_row = []
for item in input_table:
new_item = row.index(item)
new_row.append(new_item)
new_data.append(tuple(new_row))
new_data = tuple(new_data)
return new_data

def get_sum_list(table, input_num):
res_data = []
for pattern in input_num:
sum = 0
for col_num in xrange(len(table)):
row_num = pattern[col_num]
num = table[col_num][row_num]
sum += num
res_data.append(sum)
res_data = tuple(res_data)
return res_data

def main(infile, table):
# Получаем таблицу.
table = get_table(table)
# Получаем содержимое файла 'input.csv'.
indata = get_input(infile)
# Преобразовываем содержимое 'input.csv' в номера строк.
input_num = get_input_num(indata)

sum_list = get_sum_list(table, input_num)

return sum_list

if __name__ == '__main__':
infile = 'input.csv'
table = 'table.csv'

print main(infile, table)
Файл ‘input.csv’:
01 ; abcd                                                                         
02 ; abdc
03 ; acbd
04 ; acdb
05 ; adbc
06 ; adcb
07 ; bacd
08 ; badc
09 ; bcad
10 ; bcda
11 ; bdac
12 ; bdca
13 ; cabd
14 ; cadb
15 ; cbad
16 ; cbda
17 ; cdab
18 ; cdba
19 ; dabc
20 ; dacb
21 ; dbac
22 ; dbca
23 ; dcab
24 ; dcba
Файл ‘table.csv’:
 5; 11;  3; 15
7; 8; 78; 4
9; 10; 6; 0
10; 0; 1; 8



Офлайн

#2 Март 28, 2010 23:15:22

Griffon
От: Ukrain, Zaporozhie
Зарегистрирован: 2009-03-04
Сообщения: 324
Репутация: +  11  -
Профиль   Отправить e-mail  

с чего начать? хочу написать код

row = tuple(enumerate("cadb"))
result = []

table = open('table.csv')
data = []
for string in table.readlines():
data.append(map(int, string.rstrip().split(';')))

inputs = open('input.csv')
for string in inputs.readlines():
col = string.split(';')[2].strip()
summa = 0
for i, char in row:
summa += data[i][col.index(char)]
result += [summa]

print(result)
table.csv
5; 11; 3; 15
7; 8; 78; 4
9; 10; 6; 0
10; 0; 1; 8

input.csv
1 ; dfsaas ; cadb ; 242
1 ; dfsaas ; cdab ; 242
1 ; dfsaas ; dbca ; 242

Вывод консоли:
27, 101, 16



Отредактировано (Март 28, 2010 23:19:52)

Офлайн

#3 Март 29, 2010 08:40:29

Olyaleo
От:
Зарегистрирован: 2010-03-23
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

с чего начать? хочу написать код

knkd и Griffon, спасибо Вам за помощь, буду разбираться с кодами.
Я начала с кода, который написал Griffon, но мне не удается запустить скрипт, так как выдается ошибка:

[olga~/python_file]-% python programm_calculate.py
Traceback (most recent call last):
File "programm_calculate.py", line 13, in <module>
data.append(map(int, string.rstrip().split(';')))
ValueError: invalid literal for int() with base 10: '5,11,3,15\r7,8,78,4\r9,10,6,0\r10,0,1,8'
Как исправить ошибку, подскажите, пожалуйста



Офлайн

#4 Март 29, 2010 09:52:43

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

с чего начать? хочу написать код

Olyaleo
Как исправить ошибку, подскажите, пожалуйста
у Вас разделитель “,” вместо “;”, это первое, а второе - какие-то странные у Вас символы конца строки. никогда с *nix не сталкивался, но думаю что вместо символа “\r” должен быть “\n”, функция readlines() не понимает что у Вас не одна строка :(



Офлайн

#5 Март 29, 2010 13:11:13

Griffon
От: Ukrain, Zaporozhie
Зарегистрирован: 2009-03-04
Сообщения: 324
Репутация: +  11  -
Профиль   Отправить e-mail  

с чего начать? хочу написать код

Да. Принимают за конец строки либо “\n”, либо “\r\n”, но никак не “\r”.
Если нормально сохранять файл нет возможности, то можно использовать:

for string in table.readline().split('\r'):



Офлайн

#6 Март 29, 2010 17:40:05

knkd
От:
Зарегистрирован: 2009-06-14
Сообщения: 225
Репутация: +  0  -
Профиль   Отправить e-mail  

с чего начать? хочу написать код

Griffon
table = open('table.csv')
А закрыть? :)

И раз уж пошла такая потеха, то вот это:
Griffon
table = open('table.csv')
data = []
for string in table.readlines():
data.append(map(int, string.rstrip().split(';')))
Можно заменить вот этим:
data =  [[int(item) for item in row.strip().split(';')] for row in open('table.csv')]
:)

И так? (неуверенно)
result = [sum([data[i][string.split(';')[1].strip().index(char)] for (i,char) in row])  for string in open('input.csv')]
Что-то мне не нравится результат, но должно быть как-то так…
row = tuple(enumerate("cadb"))
data = [[int(item) for item in row.strip().split(';')] for row in open('table.csv')]
result = [sum([data[i][string.split(';')[1].strip().index(char)] for (i,char) in row]) for string in open('input.csv')]
print result



Отредактировано (Март 29, 2010 18:11:59)

Офлайн

#7 Март 29, 2010 19:41:31

Griffon
От: Ukrain, Zaporozhie
Зарегистрирован: 2009-03-04
Сообщения: 324
Репутация: +  11  -
Профиль   Отправить e-mail  

с чего начать? хочу написать код

Ну мы ведь о читабельности говорим. :)
Просто у тебя там накручено как-то, потому и предложил свой вариант.
А закрыть сам закроет. Чё это я за него работу лишнюю выполнять буду. Как выгрузится программа так и закроется файл. :)



Отредактировано (Март 29, 2010 19:43:50)

Офлайн

#8 Март 29, 2010 19:59:06

knkd
От:
Зарегистрирован: 2009-06-14
Сообщения: 225
Репутация: +  0  -
Профиль   Отправить e-mail  

с чего начать? хочу написать код

Griffon
А закрыть сам закроет. Чё это я за него работу лишнюю выполнять буду. Как выгрузится программа так и закроется файл.
В Линуксе да. В винде это не всегда так.
Если в цикле призойдёт исключение и программа завершится, то с определённой степенью вероятности файл останется заблокированным до перезагрузки.

Вот в этом случае интерпретатор сам обовсём позаботится.
for item in open(filename):
Кстати,я не понял ни как работает твой пример, ни даже как мой :D
Я написал его в приступе временного умопомешательства…



Офлайн

#9 Март 30, 2010 09:06:36

Olyaleo
От:
Зарегистрирован: 2010-03-23
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

с чего начать? хочу написать код

кодом

Griffon
Код:
for string in table.readline().split('\r'):
ошибку не удалось исправить.
Обратила внимание на слова:
Griffon
Если нормально сохранять файл нет возможности…
Оказалось, что у меня действительно файлы были сохранены для разных OS, после пересохранения ошибка ликвидировалась, зато вместо неё теперь появилась новая:
[olga ~/python_file]-% python programm_calculate.py
Traceback (most recent call last):
File "programm_calculate.py", line 20, in <module>
summa += data[i][col.index(char)]
ValueError: substring not found
Вроде все написала, как и было предложено
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import csv
import math

row = tuple(enumerate("abcd"))
result = []

table = open('table.csv')
data = []
for string in table.readlines():
data.append(map(int, string.rstrip().split(',')))

inputs = open('input1.csv')
for string in inputs.readlines():
col = string.split(',')[2].strip()
summa = 0
for i, char in row:
summa += data[i][col.index(char)]
result += [summa]

print(result)
Данные таблицы input1.csv
1	dfsaas	cccc	242
2 dfsaas bbbb 242
3 dfsaas aaaa 242
4 dfsaas dddd 242
я пишу на python 2.6.1 в Mac OS X



Офлайн

#10 Март 30, 2010 09:42:11

Griffon
От: Ukrain, Zaporozhie
Зарегистрирован: 2009-03-04
Сообщения: 324
Репутация: +  11  -
Профиль   Отправить e-mail  

с чего начать? хочу написать код

Дело в том что код расчитывался на то что будут уникальные символы для каждого столбца.
Тогда надо: row = “abcd” (надеюсь что для строк буквы всегда разные)

for i, char in enumerate(col):
summa += data[row.index(char)][i]
То есть если “cccc” то это сумма всех элементов в строке “c”. Я так понял.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version