в списке списков - PullRequest
       2

в списке списков

0 голосов
/ 17 января 2019

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

Рассмотрим следующие фрагменты кода:

test_list = [ # sample list of lists in which I want to replace the "\n"
      ["test\n\n\n\n\n\n\n\n", "another test\n", "spam"],
      ["egg\n\n", "house"],
      ["\n\nabc", "def\n", "\n\n\nghi", "jklm\n\n", "nop(e)", "\nqrst\n"],
      ["uvw\n", "\n\nx", "yz\n\n"]]
for item in test_list:
    for subitem in item:
    re.sub('\n', '___', subitem)
pprint.pprint(test_list)

Выход:

[['test\n\n\n\n\n\n\n\n', 'another test\n', 'spam'],
 ['egg\n\n', 'house'],
 ['\n\nabc', 'def\n', '\n\n\nghi', 'jklm\n\n', 'nop(e)', '\nqrst\n'],
 ['uvw\n', '\n\nx', 'yz\n\n']]

(вывод неизменен - ​​замена не сработала.)

Заранее спасибо за помощь.

Edit:

Спасибо Wiktor Stribiżew за ссылку. Первый совет из упомянутого вопроса - строка неизменна! - был полезен, но я не могу заставить его работать для списка списков .

Следуя советам здесь и здесь , мой код выглядит следующим образом:

newtestlist = [[re.sub("\n", '_', item) for subitem in item] for item in testlist]

Однако это не работает (выбрасывая TypeError: expected string or bytes-like object - я неправильно ссылаюсь на подпункты моего списка.) Может ли кто-нибудь указать мне правильное направление? Большое спасибо

1 Ответ

0 голосов
/ 18 января 2019

Для простого списка, ваше отредактированное решение должно сработать, но вы должны изменить re.sub("\n", '_', item) на re.sub("\n", '_', subitem), как заметил @Mark Meyer. Я также заметил опечатку; testlist вместо test_list. Вот что я тестировал и работал с твоим test_list

[[re.sub(r'\n', r'_', item) for item in sub_list] for sub_list in test_list]

Но если у вас есть глубоко вложенный список, я думаю, вам понадобится рекурсивная функция.

def sub_nested(l, regin, regout):
    """Recursive function to do string replace in a nested list"""
    retlist = []
    for item in l:
        if isinstance(item, list):
            retlist.append(sub_nested(item, regin, regout))
        else:
            retlist.append(re.sub(regin, regout, item))
    return retlist

Тестирование в вашем списке ввода.

sub_nested(test_list, r'\n', r'___')

Out: 
 [['test________________________', 'another test___', 'spam'],
 ['egg______', 'house'],
 ['______abc', 'def___', '_________ghi', 'jklm______', 'nop(e)', '___qrst___'],
 ['uvw___', '______x', 'yz______']]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...