【问题标题】:Python adding to a listPython 添加到列表中
【发布时间】:2015-08-21 17:04:15
【问题描述】:

我有一个清单

string = ['a', 'b', 'c', 'd', 'e', 'f']

我试图在列表的每 2 个字符之间留一个空格,这样它就会变成这样:

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

我试过这个:

test = 0

while test != len(string):
    for i in range(2):

        string.append(' ')
    test = test + 1

print (string)

但它给出了这个错误:

    Traceback (most recent call last):
  File "D:/Python/New folder (3)/test.py", line 8, in <module>
    string.append(' ')
MemoryError

【问题讨论】:

  • 为什么有这么多反对票?这是一个合理的问题。
  • 它没有显示出研究成果,对任何做过研究的人都不太可能有用。

标签: python list


【解决方案1】:

这不是一个紧凑的解决方案,但它的教诲:

a= ['1', '2','3','4','5','6']

将 'a' 分组为 2 个字符:

for x in range(int(len(a)/2)):
    a[x]=a[x]+a.pop(x+1)

那么,a就会变成

['12', '34', '56']

为每个项目添加一个空格(最后一个除外):

for x in range(int(len(a))-1):
    a[x]=a[x]+" "

现在让我们创建一个新列表来拆分每个“a”项:

b=[]
for x in range(int(len(a))):
    b.extend(list(a[x]))

结果:

['1', '2', ' ', '3', '4', ' ', '5', '6']

【讨论】:

    【解决方案2】:

    使用插入,而不是附加。追加添加到末尾。

    string = ['a', 'b', 'c', 'd', 'e', 'f']
    string.insert(4, ' ')
    string.insert(2, ' ')
    

    或者构建一个包含所需空格的全新列表。

    out = []
    for i, char in enumerate(string):
        out.append(char)
        if i != 0 and i % 2 != 0:
            out.append(' ')
    

    内存错误是由您的 while 循环永无止境引起的。每次迭代测试都会增长 1,但列表会增长 2。

    【讨论】:

    • while 循环每次迭代,列表都会增长 2。
    • 您可以将if i != 0 and i % 2 == 0 替换为if i and i%2。
    【解决方案3】:

    由于没有人真正正确地解释您的错误:

    您的while test != len(string): 永远不会为真,因为您一直在追加到原始列表,所以列表只会不断增长,直到最终您耗尽内存/内存,您不应该迭代并追加到同一个列表,您将需要制作一个副本或只是创建一个新的空列表并附加到该列表。

    列表以 6 个元素开始,在再次测试条件之前再添加 2 个元素,并将 test 增加 1,因此在第一个循环之后,列表中有 8 个元素,测试为 1,下一个循环有 10 个并且测试是 2 等等,直到你用完内存......

    有更好的方法,但如果您要使用循环并插入到原始列表中,您将从第三个元素开始并使用 3 步:

    string = ['a', 'b', 'c', 'd', 'e', 'f']
    
    
    for i in range(2, len(string)+2, 3):
            string.insert(i, " ")
    
    print (string)
    
    ['a', 'b', ' ', 'c', 'd', ' ', 'e', 'f']
    

    您也可以使用 itertools.chain 并在末尾使用 ind &lt; len(string) - 1 捕获多余的空格:

    from itertools import chain
    
    print(list(chain.from_iterable((ele, " ") if ind % 2 and ind < len(string) - 1 else ele
                               for ind, ele in enumerate(string))))
    
    ['a', 'b', ' ', 'c', 'd', ' ', 'e', 'f'] 
    

    【讨论】:

      【解决方案4】:

      你可以这样做:

      string = ['a', 'b', 'c', 'd', 'e', 'f']
      newstring = []
      i = 1
      
      for x in string:
          if i > 2:
              newstring.append(' ')
              newstring.append(x)
              i = 1
          else:
              newstring.append(x)
          i += 1
      
      print newstring
      

      使用这种方法似乎更清晰,并且返回相同的结果。

      【讨论】:

        【解决方案5】:

        使用列表理解

        您的测试永远不会通过,因为您每次都在附加到列表中。您实际上是在附加到列表的末尾,因此您不会像那样得到您想要的。

        一种方法可以是使用列表推导:

        string = ['a', 'b', 'c', 'd', 'e', 'f']
        #insert a space every two characters
        new_string = [[s, " "] if i % 2 else s for i, s in enumerate(string)]
        #flatten the list
        new_string = [item for sublist in new_string for item in sublist]
        

        这可以像这样在一行中完成:

        [item for sublist in [[s, " "] if i % 2 else s for i, s in enumerate(string)] for item in sublist]
        

        【讨论】:

        • == 1 部分是不必要的。
        猜你喜欢
        • 2016-01-09
        • 2020-09-10
        • 1970-01-01
        • 2021-01-10
        • 1970-01-01
        • 2014-03-07
        • 1970-01-01
        • 1970-01-01
        • 2020-03-23
        相关资源
        最近更新 更多