2013-08-12 3 views
-2

у меня есть file1, который имеет диапазоны, как этотнайти число между диапазоном чисел

10 20

50 60

70 100

150 170

....

....

file2

15

55

80

160

....

....

я хочу, чтобы читать диапазоны в file1 и посмотреть в file2 и получить значения между ними

окончательный вывод:

15 is the value between 10 and 20

55 is the value between 50 and 60

....

....

+1

ли входы всегда гарантированно соответствует 1-к-1? – user2357112

+3

и вы пытались ...? – roippi

+0

Нет, это просто пример ... У меня есть диапазоны, которые очень большие @ user2357112 – abh

ответ

1

Если вы хотите сделать что-то с другими, чем распечатать их, вы можете создать словарь, который отображает диапазон (от file1) и номеров в этих диапазонах результатов (от file2.)

ranges = [] 
with open('file1') as f: 
    for line in f: 
     ranges.append(line.strip().split(' ')) 
ranges = [tuple(int(_) for _ in r) for r in ranges] 
in_range = {range_: set() for range_ in ranges} 
with open('file2') as f: 
    for line in f: 
     num = int(line.strip()) 
     for range_ in ranges: 
      if range_[0] < num < range_[1] # Between low and high 
       in_range.add(num) 
# print in_range 
+0

Я получил эту ошибку, когда попытался запустить на примере Traceback (последний последний вызов): Файл «fi.py», строка 5, в in_range = {range_: set() для диапазона_ в диапазонах} Файл " fi.py ", строка 5, в in_range = {range_: set() для диапазона_ в диапазонах} ТипError: unhashable type: 'list' @Chris Barker – abh

+0

просто хотите распечатать вывод чисел, которые находятся между file1 range @Chris Barker – abh

+0

Единственная причина, по которой вы не можете сделать набор этих значений 'range_', состоит в том, что каждый из них является списком. Вы можете преобразовать каждый из них в кортеж, например, '{tuple (range_): set() для range_ в диапазонах}', чтобы исправить это. – abarnert

-1

Это должно сделать трюк:

with open('file1.txt') as file1, open('file2.txt') as file2: 
    ranges = [line.split(' ') for line in file1 if line.rstrip()] 
    values = filter(lambda line: bool(line.rstrip()), file2.readlines()) 
for value, _range in zip(values, ranges): 
    print("{} is {}the value between {} and {}".format(value, "not " if int(_range[0]) <= float(value) <= float(_range[1]) else "", _range[0], _range[1]) 
+0

Зачем вызывать 'readlines()'? 'для строки в файле1' делает то же самое, но без потери ресурсов и удобочитаемости. – abarnert

+0

Кроме того, 'if line' не поможет вам здесь, потому что' '\ n'' не пуст. – abarnert

+0

Это не очень читаемо. В частности, 153-символьная строка. –

0

В Python, вот как ...

Открыть файл:

with open('thefile.txt') as f: 

итерируем строк файла:

for line in f: 

Отбросить лишние пробелы в конце строки:

line = line.rstrip() 

Сплит каждая строка в двух вокруг первого блока пробельных:

left, right = line.split(None, 1) 

Преобразование строки в число:

low = int(low) 

Получить номер на полпути между двумя другими числами:

mid = (low + high) // 2 

Или, чтобы проверить, существует ли число между двумя o Ther номера:

if low <= mid <= high: 

печати отформатированный результат:

print('{} is the value between {} and {}'.format(mid, low, high)) 

Конечно, вы также хотите, чтобы некоторые обработки ошибок, и вы должны поставить все это вместе, но это должно быть достаточно, чтобы закончить его самостоятельно ,

+0

Мне не нужны средние номера. Это пример. Файл file2 может иметь разные числа, например, если диапазон 1000-1200, а в другом файле у меня есть 1129, который находится между ними. Я хочу получить это @abarnert – abh

+0

@abh: Хорошо, я добавлю еще один бит. – abarnert

+0

где я могу открыть файл 2? @abarnert – abh

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