V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
twor
V2EX  ›  Python

[['chang'], ['du'], ['zhang', 'chang']] 如何拼成 “changduchangchangduzhang”呢

  •  
  •   twor · 2019-02-01 19:03:17 +08:00 · 3056 次点击
    这是一个创建于 2120 天前的主题,其中的信息可能已经有所发展或是发生改变。
    [['chang'], ['du'], ['zhang', 'chang']] 如何拼成 “ changduchangchangduzhang ”呢
    用途就是生成字段的拼音的各种情况,方便拼音检索
    或者有其他思路?
    第 1 条附言  ·  2019-02-01 22:44:30 +08:00
    感谢 @Procumbens ,100%符合,结帖

    其他的有些童鞋估计没有领会到我神一般的表达,不是我要的
    另外一些,我的确看不懂,比如 @momocraft @jiejiss 等 ,我正在通过谷歌学习他们的回帖,:(

    再补充下应用场景
    比如 有一个字段是 “长度长”,我希望用户无论是搜索,“ cdc ” 或者 “ cdz ” 都可以搜索到
    17 条回复    2019-02-15 00:44:39 +08:00
    zst
        1
    zst  
       2019-02-01 20:00:47 +08:00 via Android
    可以 flatten 以后直接拼起来?
    momocraft
        2
    momocraft  
       2019-02-01 20:09:47 +08:00   ❤️ 1
    .reduce(笛卡尔积).map(join).join (然后自己改成 python 语法)
    EulerChen
        3
    EulerChen  
       2019-02-01 20:28:42 +08:00 via Android   ❤️ 1
    arr.flat().join('')即可

    flat 特性已在 ES2019 正式支持
    sdijeenx
        4
    sdijeenx  
       2019-02-01 20:32:43 +08:00   ❤️ 1
    >>> 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=
    Trim21
        5
    Trim21  
       2019-02-01 20:38:28 +08:00 via Android
    先 flat 再 join
    Procumbens
        6
    Procumbens  
       2019-02-01 20:55:03 +08:00   ❤️ 2
    import itertools
    sample = [['chang'], ['du'], ['zhang', 'chang']]
    result = list(itertools.product(*sample))
    for i in result:
    print(''.join(i))
    Procumbens
        7
    Procumbens  
       2019-02-01 20:56:50 +08:00   ❤️ 1
    就 2L 说的笛卡尔积是对的,LS 说 flat 的都没了解 LZ 想要什么……
    BTW,LS 我的代码最后一行的缩进被吃了👀
    sdijeenx
        8
    sdijeenx  
       2019-02-01 21:16:06 +08:00   ❤️ 1
    刚才又写了个偷鸡算法,结果还是 LS 的更好用。
    FreeEx
        9
    FreeEx  
       2019-02-01 21:19:35 +08:00 via iPhone   ❤️ 1
    flatMap 成一个数组,然后拼成一个串。
    loading
        10
    loading  
       2019-02-01 21:20:15 +08:00 via Android   ❤️ 1
    楼上都很厉害,我只能发个结帖算法了:
    if foo=="[['chang'], ['du'], ['zhang', 'chang']] " then
    foo="changduchangchangduzhang"
    fonlan
        11
    fonlan  
       2019-02-01 21:47:01 +08:00 via Android   ❤️ 1
    再来个另类的,把 List 转 str 然后用正则取出所有字母即可
    jiejiss
        12
    jiejiss  
       2019-02-01 22:14:12 +08:00 via Android   ❤️ 1
    用 built in 的工具库算笛卡尔积,或者手写 DFS。DFS 递归写着还蛮方便的。之前不知道笛卡尔积的时候就是手写的 DFS
    jiejiss
        13
    jiejiss  
       2019-02-01 22:17:27 +08:00 via Android   ❤️ 1
    或者把大数组当成一个有向图,每个子数组都是一层,每个字符串是一个节点。之后强行在最前面插一个空字符串节点来充当根结点。之后遍历一遍就好了
    wuhaochen999
        14
    wuhaochen999  
       2019-02-01 22:57:10 +08:00
    cartesian product
    Ama2in9
        15
    Ama2in9  
       2019-02-01 23:01:01 +08:00 via iPhone
    @loading 哈哈哈哈哈你他娘的真是个人才
    qilishasha
        16
    qilishasha  
       2019-02-02 08:25:08 +08:00
    @loading 优秀的程序员很多,有趣的灵魂唯独你一只
    luoleng
        17
    luoleng  
       2019-02-15 00:44:39 +08:00
    ''.join(re.findall(r'\w+?', str(your_list)))
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5340 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 07:50 · PVG 15:50 · LAX 23:50 · JFK 02:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.