将文本加入 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)
使用 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)