如何在维护列表层次结构的同时连接嵌套列表中的字符串?

2024-04-18 03:36:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下清单:

["a", "b", ["c", ["d", "e"], "f"]]

我希望在维护列表结构的同时将每个列表中的字符串元素连接在一起

预期行为如下所示:

>>> test_list = ["a", "b", ["c", ["d", "e"], "f"]]
>>> function(test_list)
["ab", ["c", ["de"], "f"]]

它与this非常相似,但必须能够处理任意数量的嵌套列表

我曾尝试使用递归函数来解决它,但未能得到预期的结果

有什么建议吗


Tags: 字符串test元素列表数量abdefunction
3条回答

您尝试使用递归来解决问题是正确的。以下是我如何设计我的功能:

sample = ["a", "b", ["c", ["d", "e"], "f"]]
desired = ["ab", ["c", ["de"], "f"]]


def mergeList(array):
    ret = []    #final array
    newEl = ""  #merged element

    for el in array:
        #If the element is a list, add our merged element and then
        #call the mergeList function on our list
        if type(el) == list:
            ret.append(newEl)
            newEl = ""  #clear the merged element so we can start over
            ret.append(mergeList(el))
        else:
            newEl += str(el)    #Add to the merged element

    #Final merge
    if newEl != "":
        ret.append(newEl)

    return ret

print(mergeList(sample))

mergedList函数将尝试逐个组合元素,直到到达列表。当它最终到达一个列表时,它将首先将组合元素存储到一个新列表中,然后使用新列表重复该过程并存储该结果。在处理之后,它将继续

我做了一个粗略的图表,我认为可以解释这一点。每个级别代表一个较小列表上的新递归调用。粗体字母表示变量newEl,该变量包含累加每个元素的字符串

Hierarchy Merge Example

使用递归,您可以通过这种方式实现

l = ["a", "b", ["c", ["d", "e"], "f"]]


def nested2str(s):
    res = []
    tmp = []
    val = None
    for i in s:
        if type(i)==str:
            tmp.append(i)
        else:
            res.append(''.join(tmp))
            tmp = []
            val = nested2str(i)
            res.append(val)
    if tmp!=[]:
        res.append(''.join(tmp))
    return res

result = nested2str(l)
print(result)

输出

['ab', ['c', ['de'], 'f']]

可以将itertools.groupby与递归一起使用:

from itertools import groupby as gb
d = ["a", "b", ["c", ["d", "e"], "f"]]
def combine(d1):
  return [i for a, b in gb(d1, key=str.__instancecheck__) 
          for i in ([''.join(b)] if a else map(combine, b))]

print(combine(d))

输出:

['ab', ['c', ['de'], 'f']]

相关问题 更多 >