Найти - Пользователи
Полная версия: с чего начать? хочу написать код
Начало » Python для новичков » с чего начать? хочу написать код
1 2 3
Olyaleo
По заголовку понятно, что я новичок в 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.: я не прошу мне писать код, я хочу сама до него додуматься, но с Вашими подсказками. Вроде и понимаю, что ничего сложного нет, но пока что ничего не получается.
knkd
# Записываем образец в файл.
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(',') # По запятой.
Андрей Светлов
import csv

Olyaleo, пока не начнете показывать свой код - мало что можно посоветовать.
Griffon
Вопрос по теме. Исходный файл <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

Как сделать быстрее?
И ещё вопрос наиболее быстрого поворота многомерного массива.
Андрей Светлов
Если у вас только цифры, зато много - наверное, нужен 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
Olyaleo
Уважаемый, Андрей, дело в том, что я хотела, чтобы Вы мне посоветовали алгоритм решения этой задачи.
Я начала писать, как я представляю этот алгоритм. Честно, говоря одни тупика, и что я в не верном направлении.
 
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

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

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

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).
knkd
Griffon
В итоге ручное чтение и преобразование в int даёт большую скорость чем работа с csv.
Хуже того - csv-модуль не поддерживает расширений CSV используемых многими программами. Ни секций, ни комментариев, ни заголовков.
Потому мест где он может быть использован для внешних данных не так много.
Приходится вручную…
Olyaleo
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
Вот поэтому я подумала, что надо брать срезы, чтобы проверить условие.
Griffon
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, оказалось в три раза медленней чем вручную, даже с учётом ручного транспонирования. Что же это творится-то а? Единственное что приятно, это то что в две строчки. :)
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