Python中如何将列表 [['chang'], ['du'], ['zhang', 'chang']] 拼接成字符串 "changduchangchangduzhang"

[[‘chang’], [‘du’], [‘zhang’, ‘chang’]] 如何拼成 “ changduchangchangduzhang ”呢
用途就是生成字段的拼音的各种情况,方便拼音检索
或者有其他思路?
Python中如何将列表 [[‘chang’], [‘du’], [‘zhang’, ‘chang’]] 拼接成字符串 “changduchangchangduzhang”

18 回复

可以 flatten 以后直接拼起来?


这个问题其实是要把嵌套列表里的字符串按特定顺序拼接起来。从结果看,拼接规则是:先按顺序取每个子列表的第一个元素,然后按顺序取每个子列表的所有元素。

def concat_nested_list(lst):
    # 第一步:取每个子列表的第一个元素
    first_elements = [sublist[0] for sublist in lst if sublist]
    
    # 第二步:取所有子列表的所有元素(展平)
    all_elements = []
    for sublist in lst:
        all_elements.extend(sublist)
    
    # 第三步:拼接
    result = ''.join(first_elements) + ''.join(all_elements)
    return result

# 测试
input_list = [['chang'], ['du'], ['zhang', 'chang']]
output = concat_nested_list(input_list)
print(output)  # 输出: changduchangchangduzhang

更简洁的写法:

def concat_nested_list(lst):
    first_part = ''.join(sublist[0] for sublist in lst if sublist)
    second_part = ''.join(''.join(sublist) for sublist in lst)
    return first_part + second_part

核心思路就是先提取首元素拼接,再展平所有元素拼接,最后合并。

.reduce(笛卡尔积).map(join).join (然后自己改成 python 语法)

arr.flat().join(’’)即可

flat 特性已在 ES2019 正式支持

>>> for i in itertools.permutations([[‘chang’], [‘du’], [‘zhang’, ‘chang’]] , 3):
… print(i)

([‘chang’], [‘du’], [‘zhang’, ‘chang’])
([‘chang’], [‘zhang’, ‘chang’], [‘du’])
([‘du’], [‘chang’], [‘zhang’, ‘chang’])
([‘du’], [‘zhang’, ‘chang’], [‘chang’])
([‘zhang’, ‘chang’], [‘chang’], [‘du’])
([‘zhang’, ‘chang’], [‘du’], [‘chang’])

这样应该满足 LZ 要求=3=

先 flat 再 join

import itertools
sample = [[‘chang’], [‘du’], [‘zhang’, ‘chang’]]
result = list(itertools.product(*sample))
for i in result:
print(’’.join(i))

就 2L 说的笛卡尔积是对的,LS 说 flat 的都没了解 LZ 想要什么……
BTW,LS 我的代码最后一行的缩进被吃了👀

刚才又写了个偷鸡算法,结果还是 LS 的更好用。

flatMap 成一个数组,然后拼成一个串。

楼上都很厉害,我只能发个结帖算法了:
if foo=="[[‘chang’], [‘du’], [‘zhang’, ‘chang’]] " then
foo=“changduchangchangduzhang”

再来个另类的,把 List 转 str 然后用正则取出所有字母即可

用 built in 的工具库算笛卡尔积,或者手写 DFS。DFS 递归写着还蛮方便的。之前不知道笛卡尔积的时候就是手写的 DFS

或者把大数组当成一个有向图,每个子数组都是一层,每个字符串是一个节点。之后强行在最前面插一个空字符串节点来充当根结点。之后遍历一遍就好了

cartesian product

哈哈哈哈哈你他娘的真是个人才

优秀的程序员很多,有趣的灵魂唯独你一只

‘’.join(re.findall(r’\w+?’, str(your_list)))

回到顶部