【问题标题】:How can i do it with list comprehension? [duplicate]我如何通过列表理解来做到这一点? [复制]
【发布时间】:2016-06-08 18:25:46
【问题描述】:

我想在一个循环周期中创建一个包含重复值的列表理解,如下所示:

s=[]
for i in range(5): 
    s+=[i,i]

但这不起作用。

[i, i for i in range(5)]

【问题讨论】:

  • 你能解释得更好吗,比如你到底想做什么?
  • [[i, i] for i in range(5)]。但是您也可以使用list(map(lambda i: [i, i], range(5)))。
  • 但我不知道该怎么做。,做什么?
  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。 See: How to create a Minimal, Complete, and Verifiable example.

标签: python


【解决方案1】:

你可以这样做:

[i for i in range(5) for j in range(2)]

输出是:

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

i 循环提供值,j 循环用于重复这些值。

【讨论】:

    【解决方案2】:

    这是zip的一种方式:

    [i for p in zip(range(5), range(5)) for i in p]
    

    【讨论】:

      【解决方案3】:

      没有直接的方法可以使用单级列表推导来执行与显式循环完全相同的操作。这是因为推导式中循环的每次迭代最多只能产生一个值(如果你有 if 子句,它可以产生零)。

      但是,对于这种特定情况,您可以使用除法来生成所需的重复值序列,同时在更大的 range 上进行迭代:

      s = [i//2 for i in range(10)]
      

      【讨论】:

      • 为什么在一次除法运算中产生两个值?
      • 它不会同时产生两个值,只有一个。但是地板除法意味着我们连续两次获得相同的值。例如,0 // 2 和 1 // 2 都是 0。
      【解决方案4】:

      我认为这可以解决问题。 [ i/2 for i in range(10)]

      列表推导式将包含与推导式中的迭代器一样多的元素。在这种情况下,迭代器是range(10)

      因为,您需要 10 个元素。您将需要超过 10 的范围并应用一些计算(在本例中为 i/2)以获得所需的元素。

      【讨论】:

        【解决方案5】:

        你可以试试这个:

        s = [[i, i] for i in range(5)].

        如果你想让它变平,你可以试试这个嵌套列表理解。

        s = [x for y in [[i, i] for i in range(5)] for x in y]
        

        【讨论】:

        • 这也是个好办法。但简单胜于复杂?
        猜你喜欢
        • 1970-01-01
        • 2012-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多