Замена чисел в списке списков соответствующими строками из текстового файла

У меня есть такой большой текстовый файл (без пробела между словами, но каждое слово в каждой строке):

this

is

my

text

and

it

should

be

awesome

.

А еще у меня есть такой список:

index_list = [[1,2,3,4,5],[6,7,8][9,10]]

Теперь я хочу заменить каждый элемент каждого списка соответствующей строкой индекса моего текстового файла, поэтому ожидаемый ответ будет таким:

new_list = [[this, is, my, text, and],[it, should, be],[awesome, .]

Я попробовал неприятный обходной путь с двумя циклами for с функцией диапазона, которая была слишком сложной (так я думал). Затем я попробовал это с linecache.getline, но это также имеет некоторые проблемы:

import linecache

new_list = []

for l in index_list:
       for j in l:
             new_list.append(linecache.getline('text_list', j))

Это создает только один большой список, который мне не нужен. Кроме того, после каждого слова я получаю плохой \n, которого я не получаю, когда открываю файл с помощью b = open('text_list', 'r').read.splitlines(), но я не знаю, как реализовать это в моей функции замены (или, скорее, создать), поэтому я не получаю [['this\n' ,'is\n' , etc...


person Lightsaber    schedule 11.06.2019    source источник


Ответы (2)


Вы очень близки. Просто используйте временный список и добавьте его к основному списку. Также вы можете использовать str.strip для удаления символа новой строки.

Пример:

import linecache

new_list = []
index_list = [[1,2,3,4,5],[6,7,8],[9,10]]
for l in index_list:
    temp = []   #Temp List
    for j in l:
        temp.append(linecache.getline('text_list', j).strip())
    new_list.append(temp)       #Append to main list. 
person Rakesh    schedule 11.06.2019
comment
О Боже, ОГРОМНОЕ ВАМ СПАСИБО! поэтому мне нужен временный список, чтобы решить эту проблему, спасибо, я кое-что узнал! - person Lightsaber; 11.06.2019

Вы можете использовать iter для этого, если у вас text_list ровно столько элементов, сколько у sum(map(len, index_list))

text_list = ['this', 'is', 'my', 'text', 'and', 'it', 'should', 'be', 'awesome', '.']

index_list = [[1,2,3,4,5],[6,7,8],[9,10]]
text_list_iter = iter(text_list)
texts = [[next(text_list_iter) for _ in index] for index in index_list]

Выход

[['this', 'is', 'my', 'text', 'and'], ['it', 'should', 'be'], ['awesome', '.']]

Но я не уверен, что это то, что вы хотели сделать. Возможно, я предполагаю какой-то порядок index_list. Другой ответ, о котором я могу думать, - это понимание списка

texts_ = [[text_list[i-1] for i in l] for l in index_list]

Выход

[['this', 'is', 'my', 'text', 'and'], ['it', 'should', 'be'], ['awesome', '.']]
person Buckeye14Guy    schedule 11.06.2019