【问题标题】:Duplicating Items within a list复制列表中的项目
【发布时间】:2013-10-16 07:47:47
【问题描述】:

我对 python 还很陌生,正在尝试弄清楚如何在列表中复制项目。我尝试了几种不同的方法并广泛搜索了答案,但总是想出如何删除重复项的答案,我觉得我错过了一些应该相当明显的东西。

我想要一个要复制的项目列表,例如如果列表是 [1, 4, 7, 10] 是 [1, 1, 4, 4, 7, 7, 10, 10]

我知道

list = range(5)
for i in range(len(list)):
    list.insert(i+i, i)
print list

将返回 [0, 0, 1, 1, 2, 2, 3, 3, 4, 4] 但如果项目不按顺序排列,则此方法不起作用。 为了提供更多上下文,我将音频作为列表处理,试图让音频变慢。

我正在与:

def slower():
     left = Audio.getLeft()
     right = Audio.getRight()
     for i in range(len(left)):
          left.insert(????)
          right.insert(????)

其中“left”返回左侧耳机中的“声音”项目列表,“right”是右侧耳机中声音的项目列表。任何帮助,将不胜感激。谢谢。

【问题讨论】:

    标签: python list duplicates


    【解决方案1】:

    这是一个简单的方法:

    def slower(audio):
        return [audio[i//2] for i in range(0,len(audio)*2)]
    

    【讨论】:

    • Py3k 兼容性说明 -- 您需要在 i/2 周围添加一个 int 以强制截断返回的浮点数 -- 但很聪明的方法。希望我能想到。
    • 或使用 // 强制整数除法
    • @Hammer -- 是的,这比int 好。很好的建议。
    【解决方案2】:

    这样的工作:

    >>> list = [1, 32, -45, 12]
    >>> for i in range(len(list)):
    ...     list.insert(2*i+1, list[2*i])
    ... 
    >>> list
    [1, 1, 32, 32, -45, -45, 12, 12]
    

    一些注意事项:

    • 不要使用list 作为变量名。
    • 将自身压缩的列表展平可能更简洁。

    例如

    >>> zip(list,list)
    [(1, 1), (-1, -1), (32, 32), (42, 42)]
    >>> [x for y in zip(list, list) for x in y]
    [1, 1, -1, -1, 32, 32, 42, 42]
    

    或者,您可以使用 itertools 懒洋洋地完成这一切:

    from itertools import izip, chain
    for item in chain.from_iterable(izip(list, list)):
        print item
    

    其实我最喜欢这种方法。当我查看代码时,我立即知道它在做什么(尽管其他人可能对此有不同的看法)。

    我想在此过程中,我只想指出,我们可以使用生成器函数做与上述相同的事情:

    def multiply_elements(iterable, ntimes=2):
        for item in iterable:
            for _ in xrange(ntimes):
                yield item
    

    让我们面对现实吧——生成器非常有趣。 :-)

    【讨论】:

    • 我喜欢列表理解
    • @Andrew -- 我愿意。话虽如此,我实际上真的很不喜欢这个列表扁平化的习语(我永远记不起这些事情应该发生的顺序)。对于我自己的代码,我通常使用itertools.chain.from_iterable 来展平嵌套序列。
    【解决方案3】:
    listOld = [1,4,7,10]
    listNew = []
    
    for element in listOld:
        listNew.extend([element,element])
    

    【讨论】:

      【解决方案4】:

      这可能不是最快的方式,但它非常紧凑

      a = range(5)
      list(reduce(operator.add, zip(a,a)))
      

      a 然后包含

      [0, 0, 1, 1, 2, 2, 3, 3, 4, 4]
      

      【讨论】:

        【解决方案5】:
        a = [0,1,2,3]
        list(reduce(lambda x,y: x + y, zip(a,a))) #=> [0,0,1,1,2,2,3,3]
        

        【讨论】:

        • 这真的和@Hammer提出的方法没有什么不同
        猜你喜欢
        • 2020-11-09
        • 1970-01-01
        • 1970-01-01
        • 2018-11-16
        • 2017-04-16
        • 1970-01-01
        • 2011-10-19
        • 2017-04-04
        相关资源
        最近更新 更多