【问题标题】:Adding delimiters in python在python中添加分隔符
【发布时间】:2019-03-16 11:34:18
【问题描述】:

我对python很陌生,一直在尝试编写一个小代码,但还没有运气,所以我决定在这里发帖。

我有一个看起来像这样的 python 列表:

['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']

我想在这个列表中插入一个分隔符“x”。问题是输出应该是这样的:

['a', 'x', 'b', 'xx', 'c', 'xxx', 'd', 'xxxx'] 

这是一个 x 的代码:

zz = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
print(zz)
print('letters with delimiters as x')
i = 1
while i < len(zz):
    zz.insert(i, 'x')
    i += 2
print(zz)

【问题讨论】:

    标签: python python-3.x list loops indexing


    【解决方案1】:

    我的第一个想法是使用所有可用的火箭筒:

    • 使用zip 将您的列表和另一个由 x、xx、xxx 组成的列表交错,使用字符串乘法完成(使用生成器理解来避免创建“硬”列表,不需要)
    • 使用itertools.chain将得到的元组展平

    像这样(第一次尝试,可行,但仍有改进空间):

    >>> lst = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
    >>> list(itertools.chain.from_iterable(zip(lst,("x"*(i+1) for i in range(len(lst))))))
    

    使用enumerate 而不是zip 的变体,稍微好一点(range(len(lst)) 通常是一个很大的禁忌 BTW):

    >>> list(itertools.chain.from_iterable((v,"x"*i) for i,v in enumerate(lst,1)))
    

    避免chain,使用 listcomp 来展平元组(可能是最明智的选择,绝对使用比符号更多的字母):

    >>> [item for elts in ((v,"x"*i) for i,v in enumerate(lst,1)) for item in elts]
    

    全部 3 个打印:

    ['a',
     'x',
     'b',
     'xx',
     'c',
     'xxx',
     'd',
     'xxxx',
     'e',
     'xxxxx',
     'f',
     'xxxxxx',
     'g',
     'xxxxxxx',
     'h',
     'xxxxxxxx']
    

    【讨论】:

    • 我一度认为这是一个 Ajax 答案!您真的必须在一行中完成所有操作吗?你有 6(!) 个右括号,看在上帝的份上!编辑:我现在取消了我的否决票,因为可接受的解决方案超过了不可读的单行,但我当然希望最糟糕的解决方案不在顶部。或此答案中的任何位置。
    • 你是对的。编辑以添加更好的变体,最后一个只有 2 个括号
    • 顺便说一句,我不介意投反对票。当您发表评论时,我已经在考虑更好的方法。现在,我将在开始时保留这个糟糕的单行字并附上免责声明,这样人们就不会认为我“变色”了我的答案并复制了其他答案。
    【解决方案2】:

    您可以使用它,创建一个临时列表 (new_zz) 并附加到该列表。

    zz = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
    print(zz)
    print('letters with delimiters as x')
    new_zz = []
    i = 0
    while i < len(zz):
        new_zz.append(zz[i])
        new_zz.append('x' * (i + 1))
        i += 1
    zz = new_zz
    print(zz)
    

    【讨论】:

      【解决方案3】:

      我会在枚举列表上使用生成器推导来生成
      (character, 'x'*(index + 1)) 元组,然后将结果展平。

      >>> lst = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
      >>> [x for tup in ((c, 'x'*i) for i, c in enumerate(lst, 1)) for x in tup]
      ['a', 'x', 'b', 'xx', 'c', 'xxx', 'd', 'xxxx', 'e', 'xxxxx', 'f', 'xxxxxx', 'g', 'xxxxxxx', 'h', 'xxxxxxxx']
      

      现在这可能有点难以阅读,最好分两步完成,将展平委托给itertools.chain.from_iterable

      >>> from itertools import chain
      >>> pairs = ((c, 'x'*i) for i, c in enumerate(lst, 1))
      >>> list(chain.from_iterable(pairs))
      ['a', 'x', 'b', 'xx', 'c', 'xxx', 'd', 'xxxx', 'e', 'xxxxx', 'f', 'xxxxxx', 'g', 'xxxxxxx', 'h', 'xxxxxxxx']
      

      【讨论】:

      • 花了我 3 次尝试达到相同的结果,可能是最好的选择
      • @Jean-FrançoisFabre 是的,有时我在第一次尝试时也无法正确理解嵌套推导 - 而且它们比阅读更难阅读。
      • 我的回答中唯一积极的一点是你看到我的内部改进过程写成作为答案。从废话提案开始,然后改进,然后再改进......以匹配您的答案:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-08
      • 2010-10-05
      • 1970-01-01
      相关资源
      最近更新 更多