Управление каждым элементом (строкой) в списке, в списке, в списке - PullRequest
0 голосов
/ 01 декабря 2018

* Использование python 3 на Python 3.6.4 в Windows

twoDlist = [
    [] * len(pathology_case_retrieval_report[1:])
    for x in range(len(pathology_case_retrieval_report[1:]))
]

Это мой список длины 67.

for i in range(len(twoDlist)):
    temp = twoDlist[i]
    temp.append(SPnumsList[i])
    temp.append(requested_ByList[i])
    temp.append(dateTimelist1[i])
    twoDlist[i] = temp

Так я добавлял каждый элемент из каждого списка(SPnumsList, requested_ByList и dateTimelist1) для каждого списка внутри большего списка (twoDlist).

Пример элемента внутри twoDlist:

['Number', 'Physician Name', ['stringN']]

* Обратите внимание, что 2-й индекс этого списка может содержать от 0 до n элементов, и я хотел бы объяснить это.

Мне нужно выполнить манипуляции со строками (с помощью регулярного выражения для каждого элемента во 2-м индексе (в частности, re.sub(r'[A-Za-z.\'\"\,\n;:]', '', stringN)). Затем добавить новый элемент обратно во 2-й индекс списка, заменив старую строку.

Я также хотел бы: взять каждый элемент stringN в

['123', 'Dr. Bob', ['string1','string2', 'string3']]

и добавить его в новый список, сохраняя при этом 'Number' и 'Physician Name'.

Пример того, как я хотел бы, чтобы мои данные выглядели так:

[
    ['123', 'Dr. Bob', 'string1'],
    ['123', 'Dr. Bob', 'string2'],
    ['123', 'Dr. Bob', 'string3'],
    # ...
]

для каждого ['Number', 'Physician Name', ['stringN']] в twoDlist.

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Вы можете сделать это довольно кратко, используя reduce ( документы здесь ), чтобы разделить каждую запись на несколько для каждой строки в списке строк с индексом 2. На каждой итерации вы также можете выполнитьподстановка регулярных выражений.

Вот пример:

import re
from functools import reduce

twoDlist = [
    ['123', 'Dr. Bob', ['string1','string2', 'string3']],
    ['456', 'Dr. Jim', ['string4','string5', 'string6']],
]

regex = r'[A-Za-z.\'\"\,\n;:]'

final = reduce(
    lambda a, sublist: a + [[*sublist[:2], re.sub(regex, "", st)] for st in sublist[2]],
    twoDlist,
    []
)

reduce повторяется по twoDlist, и каждый элемент (sublist) из twoDlist преобразуется в список списков- один для каждого элемента списка в индексе 2 - с использованием понимания списка.Затем все эти новые списки добавляются в обработанный до сих пор список.

В результате получается final as:

[
    ['123', 'Dr. Bob', '1'],
    ['123', 'Dr. Bob', '2'],
    ['123', 'Dr. Bob', '3'],
    ['456', 'Dr. Jim', '4'],
    ['456', 'Dr. Jim', '5'],
    ['456', 'Dr. Jim', '6']
]
0 голосов
/ 01 декабря 2018

С учетом

twoDlist = [['123', 'Dr. Bob', ['string1','string2', 'string3']], ['345', 'Dr. Joe', ['string4', 'string5']]]

вы можете выдать

>>> [[[*sub[:-1], x] for x in sub[-1]] for sub in twoDlist]
[[['123', 'Dr. Bob', 'string1'],
  ['123', 'Dr. Bob', 'string2'],
  ['123', 'Dr. Bob', 'string3']],
 [['345', 'Dr. Joe', 'string4'],
  ['345', 'Dr. Joe', 'string5']]]

Если вы хотите дополнительно удалить один уровень вложенности, вы можете использовать itertools.chain.from_iterable.

>>> tmp = ([[*sub[:-1], x] for x in sub[-1]] for sub in twoDlist)
>>> list(chain.from_iterable(tmp))
[['123', 'Dr. Bob', 'string1'],
 ['123', 'Dr. Bob', 'string2'],
 ['123', 'Dr. Bob', 'string3'],
 ['345', 'Dr. Joe', 'string4'],
 ['345', 'Dr. Joe', 'string5']]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...