将文本加入 Python 中的多个多级列表

Join text to several multi-level lists in Python

使用 Python,我有一堆列表要加入一些文本。这些列表具有多级条目(或用于描述它的任何术语),如下所示:

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

我想将字符串 'X' 连接到两个列表的每个元素:

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

我就是做不工整。我做了一些 'for loops' 但它看起来非常差,而且不可复制,考虑到我有几个列表:

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]

我无法适应这个。有什么想法吗?提前致谢。

您需要嵌套列表理解来保留结果列表中的结构:

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']]

嵌套列表的递归方法:

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']] 

如果您担心使用枚举创建的所有索引以及其他索引,您可能有兴趣了解切片分配。

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

虽然从技术上讲,这并没有就地赋值(它为列表推导创建了一个列表),但它会有效地直接更新 list1,并且不需要您随后赋值 list1 = [list comprehension]

如果您想实际提供单独的参数,您可以使用星号将变量打包到列表中。

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)