【问题标题】:how to fill a list with 0 using python如何使用python用0填充列表
【发布时间】:2019-06-26 17:54:47
【问题描述】:

我想从另一个列表中获取一个固定长度的列表,例如:

a = ['a','b','c']
b = [0,0,0,0,0,0,0,0,0,0]

我想得到一个这样的列表:['a','b','c',0,0,0,0,0,0,0]。换句话说,如果len(a) < len(b),我想用列表b 中的值填充列表a,直到列表b 的长度,有点类似于str.ljust 所做的。

这是我的代码:

a=['a','b','c']
b = [0 for i in range(5)]
b = [a[i] for i in b if a[i] else i]

print a

但它显示错误:

  File "c.py", line 7
    b = [a[i] for i in b if a[i] else i]
                                    ^
SyntaxError: invalid syntax

我能做什么?

【问题讨论】:

  • >>> b = [0 for i in range(10)] >>> a=['a','b','c'] >>> b = [0 for i in range(10)] >>> c = [a[i] if i >> c ['a', 'b ', 'c', 0, 0, 0, 0, 0, 0, 0]

标签: python list


【解决方案1】:

为什么不只是:

a = a + [0]*(maxLen - len(a))

【讨论】:

  • 这适用于不可变对象(如0),但不适用于可变对象。 [0 for i in range(maxlen-len(a)] 适用于不可变和可变对象。
  • 原发帖人要求零,这应该不是问题。而且您的示例仅适用于可变对象,如果您确保为每个 i 创建一个新对象。我只是将 0 替换为另一个变量,您将遇到同样的问题。
  • @S.Lott 的回答对我来说似乎适用于可变对象。
【解决方案2】:

使用 itertools 重复。

>>> from itertools import repeat
>>> a + list(repeat(0, 6))
['a', 'b', 'c', 0, 0, 0, 0, 0, 0]

【讨论】:

  • 不适用于可变对象。尝试lst = list(repeat([0], 10)),然后lst[0][0] = 1,然后打印lst
  • @naktinis 通过列表理解轻松适应(比最佳答案更多):a + [MyMutable() for repeat(0, 6)]
【解决方案3】:

为什么不直接

c = (a + b)[:len(b)]

【讨论】:

    【解决方案4】:

    更明确地说,此解决方案将b 的第一个元素替换为a 的所有元素,而不管ab 中的值如何:

    a + b[len(a):]
    

    这也适用于:

    >>> a = ['a', ['b'], None, False]
    >>> b = [0, 1, 2, 3, 4, 5]
    >>> a + b[len(a):]
    ['a', ['b'], None, False, 4, 5] 
    

    如果您不希望结果长于b

    >>> a = ['a', ['b'], None, False]
    >>> b = [0, 1, 2]
    >>> (a + b[len(a):])[:len(b)]
    ['a', ['b'], None]
    

    【讨论】:

      【解决方案5】:
      LIST_LENGTH = 10
      a = ['a','b','c']
      
      while len(a) < LIST_LENGTH:
          a.append(0)
      

      【讨论】:

      • 这非常简单明了。没有 list comprehension-fu 或 slice-notation-fu 来理解它。
      【解决方案6】:
      a+[0]*(len(b) - len(a))
      
      ['a', 'b', 'c', 0, 0, 0, 0, 0, 0, 0]
      

      【讨论】:

        【解决方案7】:

        如果你想填充可变值,例如dicts:

        map(lambda x: {}, [None] * n)
        

        其中n 是数组中元素的数量。

        >>> map(lambda x: {}, [None] * 14)
        [{}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}]
        >>> l = map(lambda x: {}, [None] * 14)
        >>> l[0]
        {}
        >>> l[0]['bar'] = 'foo'
        >>> l
        [{'bar': 'foo'}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}]
        

        没有lambda 的填充会导致每个元素都是{'bar': 'foo'}

        【讨论】:

        • [{} for x in range(14)] 实现了同样的目标。
        【解决方案8】:

        你不能这样做:

        a = ['a','b','c']
        b = [0,0,0,0,0,0,0,0]
        
        c = a + b #= ['a','b','c',0,0,0,0,0,0,0]
        

        【讨论】:

        • 固定长度对于连接列表没有问题。
        • 您的示例的结果应该是['a', 'b', 'c', 0, 0, 0, 0] 以符合 OP 的要求。
        【解决方案9】:

        只是另一种解决方案:

        a = ['a', 'b', 'c']
        maxlen = 10
        result = [(0 if i+1 > len(a) else a[i])  for i in range(maxlen)]
        

        我更喜欢其他一些解决方案。

        【讨论】:

          猜你喜欢
          • 2016-01-29
          • 1970-01-01
          • 1970-01-01
          • 2013-03-30
          • 2014-01-25
          • 2021-01-04
          • 2020-06-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多