【问题标题】:Repeating elements in list comprehension列表理解中的重复元素
【发布时间】:2010-10-13 15:44:36
【问题描述】:

我有这个列表理解:

[[x,x] for x in range(3)]

这导致了这个列表:

[[0, 0], [1, 1], [2, 2]]

但我想要的是这个列表:

[0, 0, 1, 1, 2, 2]

生成此列表的最简单方法是什么?

【问题讨论】:

    标签: python list-comprehension


    【解决方案1】:
    [y for x in range(3) for y in [x, x]]
    

    【讨论】:

    • 如果想生成它,可以写[x]*2 而不是[x,x]
    • @phimuemue:这样会更慢
    【解决方案2】:
    >>> [i for i in range(3) for _ in range(2)]
    [0, 0, 1, 1, 2, 2]
    

    【讨论】:

      【解决方案3】:

      一个通用的解决方案;

      m = 3   #the list of integers
      n = 2   # of repetitions
      [x for x in range(m) for y in range(n)]
      

      【讨论】:

        【解决方案4】:
        >>> [int(x/2) for x in range(6)]
        [0, 0, 1, 1, 2, 2]
        

        【讨论】:

        • 也许将整数除法运算符与x // 2 一起使用会比int(x / 2) 更好?在 Python 2.7 中,timeit 显示 // 的速度比 Python 3.1 快两倍多一点,对于大范围,几乎是三倍。
        【解决方案5】:

        我的解决方案:

        def explode_list(p,n):
            arr=[]
            track=0
        
            if n==0:
                return arr    
            while track<len(p): 
                m=1
                while m<=n:
                    arr.append(p[track])
                    m=m+1
                track=track+1
        
            return arr
        

        【讨论】:

          【解决方案6】:

          你可能会侥幸逃脱:

          [floor(x/2) for x in range(6)]
          

          编辑1

          [int(x/2) for x in range(6)]
          

          同样是更便携的解决方案。尽管其他提供的答案似乎更好。

          【讨论】:

          • math.floor() 返回一个float,所以这不太一样。
          • 虽然返回 py3k 中的整数
          【解决方案7】:
          [x/2 for x in range(6)]
          

          更新:

          [x//2 for x in range(6)] #ok now ?
          

          【讨论】:

          • @Ant:更改为 py3k 语法很简单。然而,Ned 给出了相同的解决方案
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-02-11
          • 1970-01-01
          • 1970-01-01
          • 2021-10-06
          • 1970-01-01
          • 2017-11-28
          • 2013-01-30
          相关资源
          最近更新 更多