2014-02-01 2 views
0

У меня следующая проблема:Соответствующие таблицы в Python

У меня есть две таблицы, (txt/csv), с двумя колоннами (первый столбец позиция х, вторая позиция столбца у), и они составляют пару.

Таблицы T должны быть прочитаны, а значения совпадают: поэтому каждая пара x-y в таблице одна должна сравниваться с каждой x-y-парой в таблице 2. Если есть совпадения, необходимо создать новую таблицу.

Я уже делал это в TopCat, но это нужно в Python (я использую Python 2.7). Однако значения не округляются одинаково, и если я их сопоставляю, то нет соответствующих пар (например, 1.2398 & 3.9735, 1.239857 & 3.973522).

Любая помощь будет принята с благодарностью!

+3

У меня нет времени на реальный ответ, но ... [ 'круглый (number, num_digits) '] (http://docs.python.org/2/library/functions.html#round) –

ответ

1

Другой способ округления до i.e 4 десятичных знаков: '%0.4f' % float(1.239857), где выход будет 1.2399.

Для вашей проблемы - так как у меня есть много времени ~ -, вы можете использовать/см:

def get_coordinates(infile, delimiter): 
    new_list = [] 
    with open(infile, 'r') as f: 
     for line in f: 
      x, y = [float(i) for i in line.strip().split(delimiter)] 

      ## rounding happens here: 4 decimal places for x and y 
      new_list.append('%0.4f,%0.4f' % (x, y)) 

    return new_list 


## Extract x,y coordinates from input file given delimiter 
LIST1 = get_coordinates('table1.txt', ',') 
LIST2 = get_coordinates('table2.txt', ',') 

## New list with common coordinates between the two file 
NEW_LIST = list(set(LIST1) & set(LIST2)) 

## print result to output file: "outfile.txt" 
with open('outfile.txt', 'w') as outfile: 
    for xy in NEW_LIST: 
     ## write entries "x,y" -- this the default 
     outfile.write('%s\n' % xy) 

     ## ----------------------------------------------------- 
     ## by default it will be CSV, but 
     ## if you want to split by tabs then 
     ## comment out previous part & uncomment the following: 
     ## ----------------------------------------------------- 

     # outfile.write('%s\n' % '\t'.join(xy.split(','))) 
+0

Там ** есть ** разница. Использование 'round' также хорошо ... вокруг результатов, в то время как ваше решение будет просто преобразовывать поплавки в строки и нарезать их на 4 цифры после точки. Я не уверен, какой будет предпочтительный вариант OP – yuvi

+0

Я думаю, что этот метод сначала округляет поплавок до 4-х цифр после точки, а затем преобразует его в строку ... поскольку ''% 0.4f '% 0.99999999999' производит '' 1.0000'' не '0.9999' :) – csiu

+0

О да. Странно, я не знал об этом. Кажется, это неинтуитивно. Почему форматирование строк делает что-то еще, кроме того, что форматирует строку? Интересно, использует ли он ту же функциональность, что и «round», и если бы вы не получали одинаковые результаты ... Это довольно интересно ... – yuvi

Смежные вопросы