Уведомления

Группа в Telegram: @pythonsu

#1 Март 25, 2010 16:50:20

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

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

По заголовку понятно, что я новичок в Pythone. Пытаюсь расширять свои знания в этой области. Почитала литературу, теперь надо практиковаться. Решила составить себе задачу, так как интересно научиться работать с данными в формате csv.
Так вот: допустим, у меня есть два файла с данными формата csv. В одном файле - данные, которые могут изменятся (назову его, Таble1.csv). Во втором - значения постоянные (Таble2.csv). В Таble1.csv находится несколько колонок, к примеру, мне нужны данные из третьей колонки. И надо провести сравнения с Таble2.csv, и отыскать значения элемента. К примеру, дан какой-нибудь буквенный код в третий колонке Таble1.csv: ABCD, а в Таble2.csv есть только числовые значения, так сказать матрица :
5 7 9 10 - “C”
11 8 10 0 - “ A”
3 78 6 1 - “D”
15 4 0 8 - “B”
Я знаю, что первая строка принадлежит значению С; 2-ая - А; 3-ья - D; 4 соответственно -В. И мне надо найти сумму значений каждого элемента данного кода, которые берется из столбца Таble1.csv. А данные, полученные в результате вычисления, записываются в другой файл Output.csv - хоть это как сделать я знаю :)
Результат ожидаю такой, для кода АВСD = 11+4+9+1 = 25.
Так у меня сразу же несколько вопросов и просьб:
1) посоветуйте, пожалуйста, господа - питомеры, какие в данном случае операторы лучше всего применить, с чего вообще начать?
2) может Таble2.csv целесообразней прописать как вложенную в коде, а не читать из файла?
3) как мне прописать в коде, чтобы данные считывались именно с 3-го столбца Таble1.csv?

P.S.: я не прошу мне писать код, я хочу сама до него додуматься, но с Вашими подсказками. Вроде и понимаю, что ничего сложного нет, но пока что ничего не получается.



Офлайн

#2 Март 25, 2010 17:30:18

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

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

# Записываем образец в файл.
open('file.csv','w').write('5 7 9 10\n11 8 10 0\n 3 78 6 1\n15 4 0 8')

# Читаем образец из файла.
data = dict(zip('CADB', [sum([float(y) for y in x.split()]) for x in open('file.csv')]))

print data
-> {'A': 29.0, 'B': 27.0, 'C': 31.0, 'D': 88.0}
Можно считать это незначительной подсказкой.
# Чтение строк из файла:
for row in open('MyFile.csv', 'r'):
row # Операции над строкой.

# Разделение строки:
row.split() # По пробелу.
row.split(' ') # Или так.
row.split(',') # По запятой.



Отредактировано (Март 25, 2010 17:35:24)

Офлайн

#3 Март 25, 2010 17:49:44

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

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

import csv

Olyaleo, пока не начнете показывать свой код - мало что можно посоветовать.



Офлайн

#4 Март 26, 2010 12:10:03

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

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

Вопрос по теме. Исходный файл <1, 2, 3> (без ковычек конечно). Результат работы csv - . У меня огромное количество данных.
В итоге ручное чтение и преобразование в int даёт большую скорость чем работа с csv.

f1 = """
import csv
f = open('1.dat')
csvr = csv.reader(f, skipinitialspace = True)

data = []
for arr in csvr:
data.append(list(map(int, arr)))
"""


f2 = """
f = open('1.dat')
data = []
for string in f.readlines():
data.append(list(map(int, string.rstrip().split(','))))
"""

import timeit
print(timeit.Timer(f1).timeit(10))
print(timeit.Timer(f2).timeit(10))
Вывод:
0.4854
0.2050

Как сделать быстрее?
И ещё вопрос наиболее быстрого поворота многомерного массива.



Офлайн

#5 Март 26, 2010 13:18:23

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

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

Если у вас только цифры, зато много - наверное, нужен numpy.
Для чтения - http://www.scipy.org/Numpy_Example_List#loadtxt http://www.scipy.org/Numpy_Example_List#fromfile
Под поворотом массива имели в виду транспонирование? Тогда http://www.scipy.org/Numpy_Example_List#transpose



Отредактировано (Март 26, 2010 13:49:48)

Офлайн

#6 Март 28, 2010 16:32:43

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

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

Уважаемый, Андрей, дело в том, что я хотела, чтобы Вы мне посоветовали алгоритм решения этой задачи.
Я начала писать, как я представляю этот алгоритм. Честно, говоря одни тупика, и что я в не верном направлении.

 
import csv
import math

#Делаю вложенную матрицу
mat = [ [5,11,3,15],
[7,8,78,4],
[9,10,6,0],
[10,0,1,8] ]

#Далее каждому столбцу присвоила имя
for row in mat:
с=row[0: 1]
a=row[1: 2]
d=row[2: 3]
b=row[3: 4]

# Читаю данные с таблицы Input.csv
reader = csv.reader(open('Input.csv', 'rU'), dialect='excel')

#присваиваю имя каждой букве кода 2 столбца
for s in reader:
j1=s[1][0]
j2=s[1][1]
j3=s[1][2]
j4=s[1][3]
А дальше я хочу по кодам, которых во 2 столбце таблицы Input.csv несколько (abcd, acdb, bcda, cabd и т.п.), найти значение их букв из вложенной таблице. А для этого мне надо первую букву кода сравнить с буквами вложенной таблицы, и записать значение. А уже потом все данные сложить.
А именно:
“c” “a” “d” “b” код из таблицы Input (abcd)
5 (11) 3 15 a
7 8 78 (4) b
(9) 10 6 0 c
10 0 (1) 8 d
в результате должно быть: a+b+c+d = 11+4+9+1=25

Что можете мне подсказать?

Спасибо всем за помощь



Офлайн

#7 Март 28, 2010 17:22:32

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

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

В первый раз вы объясняли понятнее.
Попробуйте повторить :)

Olyaleo
for row in mat:
с=row[0: 1]
a=row[1: 2]
d=row[2: 3]
b=row[3: 4]
В данном участке кода вы берёте из списка mat по одному подсписку.
Потом делаете нечто совершенно невообразимое: создаёте локальные переменные (c, a, d, b) и присваиваете им по одному элементу из каждого рядка (кстати зачем срез? вам нужно выбрать элемент, а не срез с=row)
При этом при каждой итерации цикла ваши переменные перезаписываются. Тоесть после окончания цикла в них находятся (c==10, a==0, d==1, b==8).

В общем не слушайте Андрея Светлова, он не понимает трагизма ситуации :)
Сначала попробуйте сделать это без модуля CSV вручную, и только когда поймёте как всё работает тогда и сделаете (import csv).



Офлайн

#8 Март 28, 2010 17:27:42

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

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

Griffon
В итоге ручное чтение и преобразование в int даёт большую скорость чем работа с csv.
Хуже того - csv-модуль не поддерживает расширений CSV используемых многими программами. Ни секций, ни комментариев, ни заголовков.
Потому мест где он может быть использован для внешних данных не так много.
Приходится вручную…



Офлайн

#9 Март 28, 2010 18:35:07

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

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

knkd, да Вы правы, что-то я накрутила с мыслями. Начну с начала. У меня есть два файла формата Excel (Input и Таbl). В файле Input (во 2-ом столбце ) находятся коды (abcd, acdb, bcda, cabd и т.п. комбинации), а в файле Table находится таблица чисел, которая постоянная:
5, 11, 3, 15
7, 8, 78, 4
9, 10, 6, 0
10, 0, 1, 8
Я знаю, что 1-ому столбцу принадлежат значения буквы “c”, 2-ому-“a”, 3-ему - “d” и 4-ому - “b”. Поэтому я решила сделать эту таблицу в виде вложенной матрицы.
Что я хочу: чтобы программа из Input считывала код, находила значения каждой буквы и их с суммировала. Нахождение своего числа происходит следующим образом:
берется первая буква кода, проверяется по строке вложенной матрицы, где буквы совпали то значение и записывается, например,
первая буква кода - a, ищем по первой строке 5, 11, 3, 15, где у нас будет выполнятся условие a=a, это цифра 11. Так как 2-ой столбец это у нас значения буквы “а” +
вторая буква - b, ищем по второй строке 7, 8, 78, 4, где выполняется условие b=b, это цифра 4. Так как 4-ый столбец это у нас значения буквы “b” +
третья буква - c, ищем по третьей строке 9, 10, 6, 0, где выполняется условие c=c, это цифра 9. Так как 1-ый столбец это у нас значения буквы “c” +
четвертая буква - d, ищем по четвертой строке 10, 0, 1, 8, где выполняется условие d=d, это цифра 1. Так как 3-ий столбец это у нас значения буквы “d”
В результате получаем следующее, для кода abcd = 11+4+9+1=25
к примеру для кода cdaa = 5+78+10+0=93
Вот поэтому я подумала, что надо брать срезы, чтобы проверить условие.



Офлайн

#10 Март 28, 2010 19:48:45

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

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

col = "abcd"
row = "bcda"

arr = [[1, 2, 3, 4], [ 5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]]

sum = 0
for i, char in enumerate(col):
sum += arr[row.index[char]][i]

print sum
Не проверял но должно работать.

upd: Попробовал numpy, оказалось в три раза медленней чем вручную, даже с учётом ручного транспонирования. Что же это творится-то а? Единственное что приятно, это то что в две строчки. :)



Отредактировано (Март 28, 2010 20:31:58)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version