Посчитайте, сколько чтений в файле данных находится в интервале от эталонного файла.питон - PullRequest
0 голосов
/ 31 августа 2011

Я пытаюсь подсчитать количество попаданий, значение в одном файле (столбце) попадает между интервалами из другого файла (два столбца).

Я полностью застрял на том, как отобразить это.

Я пробовал что-то вроде этого:

for line in file1:
    if line[0]=line2[0] and line2[1]<line[1]<line2[2]:
    print line

Я не уверен, правильно ли это.

file 1:
elem1     39887
elem1     72111

file 2:
elem1     1     57898
elem1     57899 69887
elem2     69888 82111

В file1 elem1 является элементом в моем проекте. значение 39887 является начальной координатой.

В file2 elem1 все еще является элементом в моем проекте, но значения - это начальная и конечная координаты. Файл2 является только справочным файлом.

Для каждой строки в file2 я хочу увидеть, если "elem #" == "elem #" в файле 1. Если elem # в file1 равен elem # в file2, то я хочу продолжить в этом зациклиться и посмотреть, находится ли соответствующее значение в file1 между начальной и конечной позициями в file2.

Например, в первой строке файла file1 elem1 == elem1 в первой строке файла file2. Поскольку они равны, 39887 между 1 и 57898? Да, это так, поэтому посчитайте это. Мне нужно сделать это для каждой строки в file2.

В конце я хочу посмотреть, сколько элементов находится в каждой группе координат из файла 2.

Ответы [ 2 ]

0 голосов
/ 31 августа 2011

Отбросьте понятия «файлы» на секунду и подумайте о данных.

У вас есть две группы текстовых данных, одна из которых представляет собой один столбец, а другая - два столбца, верно?Предположим, на секунду вы можете разделить текст на два столбца, в действительности у вас есть три списка (после преобразования строк в целые числа, скажем):

c1 = [random.randint(0,100) for i in range(100)]     
c2 = [random.randint(0,100) for i in range(100)]
c3 = [random.randint(0,100) for i in range(100)]

Если я понимаю, вы хотите посчитатьинтервал попадания данных в с1 в с2 и с3, верно?Теперь сосредоточьтесь на том, что такое «хит».Если у вас 3 в с1, и у вас [1,3,5,5,3,10] в с2, сколько хитов это?Только 3 х?Интервал между 1,3,5?Или интервал 1,3,5,5,3?Или все вышеперечисленное.

В качестве простого примера, с приведенными выше списками случайных чисел int, он печатает каждое int в c1, которое встречается как в c2, так и в c3:

for i in c1:
    if i in c2 and i in c3:
        print i 

Как только вы определите, что такое «хит»есть, эта базовая структура будет работать.Как только у вас есть базовые данные и структура «хита», вернитесь и разберитесь с файлами.Должно быть легко тогда.

Редактировать: Если Я понимаю, что вы пытаетесь сделать (а это огромный , если ), это фреймворк:

with open("file2.txt") as val_file:
    for val_line in val_file:
        val_elems=val_line.split()
        with open("file1.txt") as int_file:
            for int_line in int_file:
                int_elems=int_line.split()
                if (int_elems[0] == val_elems[0] and 
                    int_elems[1] > val_elems[1] and
                    int_elems[1] < val_elems[2]):
                        print val_line

При использовании данных примера: elem1 1 57898

Мне не ясно, пытаетесь ли вы 1) позиционно сравнивать два файла построчно или 2)если вы читаете каждую строку файла 2 и сравниваете ее со всеми строками файла 1. Пример, приведенный здесь, делает позже.

0 голосов
/ 31 августа 2011

Предполагая, что ваши строки совпадают один к одному (поэтому вы хотите проверить, находится ли значение в первой строке одного файла между значениями в первой строке другой, второй строки во второй строке и т. Д.), Вы можете zip два файла, чтобы перебрать их в шаге:

with open(...) as interval_file, open(...) as value_file:
    for value, interval in zip(interval_file, value_file):
        left, right = map(int, interval.split())
        if float(left) <= float(value) <= float(right):
            #do stuff
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...