python эффективная замена строк во вложенном массиве - PullRequest
0 голосов
/ 08 мая 2018

У меня есть текстовый файл с тысячами строк в виде строк. Каждая строка начинается в формате «#integer», например, «# 100».

Я последовательно читаю txt-файл (строка № 1, № 2, № 3 ..) и получаю определенный массив, который мне нужен, где массив представляет собой набор номеров строк и других строк, связанных с этими строками:

Массив имеет вид:

[ ['#355', '#354', '#357', '#356'], ['#10043', '#10047', '#10045'], ['#1221', '#1220', '#1223', '#1222', '#1224'], [...] ]

Может содержать сотни чисел. (это потому, что у меня есть массив чисел и дополнительные «потомки», связанные с ними, добавленные в каждый подмассив.)

Я прочитал свой текстовый файл перед следующей функцией: это означает, что сначала я прочитал свой текстовый файл, извлек число и затем передал его в виде массива в функцию extended_Strings, которая заменяет каждое число на фактическая строка для этой числовой строки из текстового файла .

def extended_strings(matrix,base_txt):
  string_matrix = matrix #new matrix to contain our future strings
  for numset in string_matrix:
    for num in numset:
      for line in base_txt:
        results = re.findall(r'^#\d+', line) #find the line # at start of string
        if len(results) > 0  and results[0] == num: #if we have a # line that matches our # in the numset
          index = numset.index(num) #find index of line # in the numset
          numset[index] = line #if we match line #'s, we replace the line # with the actual string from the txt

  return string_matrix

Я пытаюсь сделать этот процесс короче и эффективнее, например, у меня есть 150 000 строк в txt, миллионы раз файл txt сканируется строкой for line in base_txt.

Есть предложения?

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Спасибо за помощь Вернеру Венцелю, Я нашел решение, которое работает для меня, и хотел бы поделиться им здесь:

import re

def file_to_dict(file_name):
    file_dict = {}
    with open(file_name) as f:
        for line in f:
            stg = re.findall("(.+)",line)
            stgNum = re.findall("#\d{1,10}",line)
            file_dict[stgNum[0]] = stg[0]
    return file_dict

def extended_strings(matrix, file_dict):
    string_matrix = []
    for numset in matrix:
        new_numset = []
        for num in numset:
            new_numset.append(file_dict[num])
        string_matrix.append(new_numset)
    return string_matrix


matrix = [['#1010', '#35', '#2', '#145', '#8888'], ['#30', '#2'], ['#65422', '#1', '#13331', '#77', '#101', '#8888']]

file_dict = file_to_dict('text.txt')
string_matrix = extended_strings(matrix, file_dict)
for list_ in string_matrix:
    for line in list_:
        print line

print "done"
0 голосов
/ 09 мая 2018

Я не делал никаких измерений. Но я уверен, что это могло бы помочь. С другой стороны, еще много возможностей для улучшения.

text.txt:

#1 This is line #00001
#2 This is line #00002
#30 This is line #00030
#35 This is line #00035
#77 This is line #00077
#101 This is line #00101
#145 This is line #00145
#1010 This is line #01010
#8888 This is line #08888
#13331 This is line #13331
#65422 This is line #65422

Код:

import re

# reo = re.compile(r'^(#\d+)\s+(.*)\n$')           # exclude line numbers in "string_matrix"
reo = re.compile(r'^((#\d+)\s+.*)\n$')             # include line numbers in "string_matrix"

def file_to_dict(file_name):
    file_dict = {}
    with open(file_name) as f:
        for line in f:
            mo = reo.fullmatch(line)
            # file_dict[mo.group(1)] = mo.group(2) # exclude line numbers in "string_matrix"
            file_dict[mo.group(2)] = mo.group(1)   # include line numbers in "string_matrix"
    return file_dict

def extended_strings(matrix, file_dict):
    string_matrix = []
    for numset in matrix:
        new_numset = []
        for num in numset:
            new_numset.append(file_dict[num])
        string_matrix.append(new_numset)
    return string_matrix


matrix = [['#1010', '#35', '#2', '#145', '#8888'], ['#30', '#2'], ['#65422', '#1', '#13331', '#77', '#101', '#8888']]

file_dict = file_to_dict('text.txt')
string_matrix = extended_strings(matrix, file_dict)
for list_ in string_matrix:
    for line in list_:
        print(line)
    print()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...