2015-02-12 4 views
-1

У меня есть два следующих файла.Поиск значения между двумя целыми числами в python

  1. Если второй столбец файла 1 соответствует первый столбец файла 2
  2. И если второй столбец файла 2 находится в интервале от 3-го и 4-го столбца файла 1, печать, как на выходе.

Я пытался написать скрипт python для этого, но я не знаю, как его сформулировать.

File 1: 

a2 sca4 15 20 
b3 sca4 22 30 
c4 sca6 45 65 

File 2: 

sca4 17 
sca4 18 
sca4 19 
sca6 46 

output: 

a2 sca4 17 15 20 
a2 sca4 18 15 20 
a2 sca4 19 15 20 
c4 sca6 46 45 65 
+0

Являются ли строки 2-го столбца уникальными в файле 2 или они повторяются? В вашем примере 'sca4' присутствует дважды в файле 1, но только один раз в файле 2. – Math

+0

Второй столбец в файле 2, номера, они уникальны. То есть я могу иметь несколько раз sca4, но разные числа лежат в интервале в файле1. Я редактировал свой вопрос. Я также пытаюсь, но мне нужно изменить свой код, чтобы показать, что я пробовал до сих пор. –

ответ

2

Я бы пошел с решением вроде Math, уже опубликованным, за исключением инструкции with для f чтение.

file2_dict = {} 
with open("file2.txt") as fo: 
    file_contents = fo.read() 
    for line in file_contents.split("\n"): 
     if not line.strip(): 
      continue 
     key, value = line.strip().split(" ", 1) 
     if key not in file2_dict: 
      file2_dict[key] = [] 
     file2_dict[key].append(int(value)) 

output_string = "" 
with open("file1.txt") as fo: 
    file_contents = fo.read() 
    for line in file_contents.split("\n"): 
     if not line.strip(): 
      continue 
     name, id, min, max = line.strip().split(" ") 
     for value in file2_dict.get(id, []): 
      if int(min) < value < int(max): 
       output_string += line.replace(id, "%s %d" % (id, value)) 
       output_string += "\n" 

print output_string 
+0

Хорошо, я действительно забыл закрыть соединение. – Math

+0

Не только для того, чтобы закрыть соединение, но для меня с утверждением кажется более «pythonic», чем файл открытым и закрытым :-) – thiruvenkadam

+0

Да, это решение замечательно, так как я могу это понять. Большое спасибо за Вашу помощь. –

1

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

import sys 

def process_files(one, two): 
    for line in [line.strip().split(" ") for line in open(two, 'r').readlines()]: 
     for x in filter(lambda x: x[1] == line[0], [z.strip().split(" ") for z in open(one, 'r').readlines()]): 
      if int(x[2]) <= int(line[1]) <= int(x[3]): 
       print(" ".join(x)) 

if __name__ == "__main__": 
    process_files(sys.argv[1], sys.argv[2]) 
+0

Спасибо за ваше решение. Использование 'filter' и' lamda' слишком продвинуто для меня, не могли бы вы немного объяснить код? –

+0

В принципе, мы берем все строки в «файле B». Для каждой строки мы отфильтровываем строки, которые не соответствуют первому элементу из набора строк в «файле А». После обрезки этого набора мы проверяем, соответствуют ли строки в «файле A» (после фильтрации) второму условию (I.E., состояние 3-го и 4-го столбцов); если это так, мы печатаем соответствующую строку. –

+0

Я не пытаюсь быть большой головой и все такое. Если какая-то тема, кажется, продвинута, было бы лучше изучить их. В случае Python любая тема может быть быстро изучена. – thiruvenkadam

1

Я хотел бы использовать dict получить каждый индекс имеющихся в файле 2, а затем пройти через файл 1.

ff = file("file2", "r") 
file2 = ff.readlines() 
ff.close() 
dict_f2 = dict() 
for line in file2: 
    ll = line.strip().split(" ") 
    if (ll[0] in dict_f2): 
     dict_f2[ll[0]].append(int(ll[1])) 
    else: 
     dict_f2[ll[0]] = list() 
     dict_f2[ll[0]].append(int(ll[1])) 

ff = open("file1", "r") 
file1 = ff.readlines() 
ff.close() 
for line in file1: 
    ll = line.strip().split(" ") 
    if (ll[1] in dict_f2): 
     sup = int(ll[4]) 
     inf = int(ll[3]) 
     for (comp in dict_f2[ll[1]]): 
      if (comp >= inf and comp <= sup): 
       print(line[0:2] + str(comp) + line[2:]) 
Смежные вопросы