Присоединить текст к нескольким многоуровневым спискам в Python - PullRequest
1 голос
/ 03 июля 2019

Используя Python, у меня есть несколько списков, к которым я хочу добавить текст.Эти списки имеют многоуровневые записи (или любой другой термин, используемый для его описания), например:

list1:
   (['abc'],
    ['def', 'ghi'])
list2:
   (['123'],
    ['456', '789'])

Я хотел бы присоединить строку 'X' к каждому элементу обоих списков:

list1:
   (['Xabc'],
    ['Xdef', 'Xghi'])
list2:
   (['X123'],
    ['X456', 'X789'])

Я просто не могу сделать это аккуратно .Я сделал несколько «циклов», но это кажется невероятно плохим и не воспроизводимым, учитывая, что у меня есть несколько списков:

for index, item in enumerate(list1):
    for index2, item2 in enumerate(item):
        list1[index][index2] = "X" + item2

for index, item in enumerate(list2):
    for index2, item2 in enumerate(item):
        list2[index][index2] = "X" + item2

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

list = ["X" + string for string in list]

Я просто не могу это адаптировать.Какие-нибудь мысли?Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 03 июля 2019

Вам нужно понимание вложенного списка, чтобы сохранить структуру в результирующем списке:

list1 = [['abc'], ['def', 'ghi']]

[[f'X{j}' for j in i] for i in list1]
# [['X{}'.format(j) for j in i] for i in list1] # for python 3.6 <
[['Xabc'], ['Xdef', 'Xghi']]

Для нескольких списков вы можете определить следующую функцию генератора:

def add_text(text, *lists): 
    for l in lists:
        yield [[text + '{}'.format(j) for j in i] for i in l] 

l1, l2 = list(add_text('X', list1, list2))

print(l1)
# [['Xabc'], ['Xdef', 'Xghi']]

print(l2)
# [['XX123'], ['XX456', 'XX789']]
1 голос
/ 03 июля 2019

Вам может быть интересно узнать о назначении срезов, если вас интересовали все индексы, которые вы создавали с помощью перечисления, а что нет.

for b in list1 :
    b[:]= ["X"+a for a in b]

Хотя технически это не делает назначение на месте (оно создает список для понимания списка), оно будет эффективно обновлять list1 напрямую и не требует, чтобы вы назначали list1 = [list compceptionsion]

Если вы хотите указать отдельные параметры, используйте звездочку для упаковки переменных в список.

def update_lists(prepend_text, *lists) :
    for list in lists :
        update_list(prepend_text, list)

def update_list(prepend_text, list) :
    for b in list :
        b[:]= [prepend_text+a for a in b] 
update_lists("X", list1,list2)

В качестве альтернативы вы можете определить функцию следующим образом:

def update_lists(prepend_text, lists) :
    for list in lists :
        update_list(prepend_text, list)

, а затем вызвать функцию как

update_lists("X", [list1,list2])

или, может быть, лучше, если вы создадите список списков динамически

lists = []
lists.append(list1)
lists.append(list2)
update_lists("X", lists)
1 голос
/ 03 июля 2019

Рекурсивный подход для вложенных списков:

list1=[['abc'], [ ['def', 'ghi'],'jlk']]


def apply(f,nested) :
    if isinstance(nested,str): return f(nested)
    return [ apply(f,x) for x in nested ]

apply(lambda s : "X"+s , list1 )
Out : [['Xabc'], [['Xdef', 'Xghi'], 'Xjlk']] 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...