在列表中加入元素,直到找到某些元素为止,然后跳过它并添加其余元素

时间:2019-02-05 14:43:20

标签: python list loops

我有一个列表,其中包含来自某些日志的数据,其中日志的每一行均作为新元素写入,并且在完成并再次继续时还写入\n (new line)

我在这里的想法是添加所有元素,直到在列表中找到\ n为止,然后将它们添加到一个字符串中,然后将其发送到另一个列表中,然后继续该过程直至最后。

示例:

  

list1 = ['\ tat ONEONEsun.nio.ch.EPollArrayWrapper.epollWait(Native   方法)\ n','\ tat       sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269)\ n','\ t sun.nio。       ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:79)\ n','\ t sun.nio.ch.Se       lectorImpl.lockAndDoSelect(SelectorImpl.java:86)\ n','\ t-锁定<0x0012550080d3       fe80>(一个io.netty.channel.nio.SelectedSelectionKeySet)\ n','\ t-锁定<0x0445000       '\ n','\ n','\ tat TWOTWOTWO.nio.ch.EPollArrayWrapper.epollWait(本机方法)\       n','\ tat sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269)\ n','\ ta       t sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:79)\ n',   '\ t太阳       .nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86)\ n','\ t-锁定<0x00       00000085d3fez0>(一个io.netty.channel.nio.SelectedSelectionKeySet)\ n','\ t-锁定       <0x0000000080d40f80>,'\ n']

我要添加

中的元素
  

`'\ tat ONEONEsun.nio.ch.EPollArrayWrapper.epollWait(Native   方法)\ n','\ tat   sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269)\ n',   '\ tat sun.nio。   ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:79)\ n','\ tat   sun.nio.ch.Se lectorImpl.lockAndDoSelect(SelectorImpl.java:86)\ n',   '\ t-锁定<0x0012550080d3 fe80>(a   io.netty.channel.nio.SelectedSelectionKeySet)\ n','\ t-锁定   <0x0445000'\ n'

放入一个字符串并将其发送到另一个列表,跳过\n元素,然后再次从下一个元素添加它,直到找到下一个\n,依此类推。可能吗?我尝试了下面的方法,但是整个代码都被添加了。

我正在尝试分析进入我们的某些日志并被卡在这里。

我的代码:

lines3 = []

for x in range(0, len(lines1)):
    if lines1[x] == "\n":
        pass
    else:
        word = "".join(lines1)
        lines3.append(word)

抱歉,上面的语法未被接受为代码,因此已更新为引号。

2 个答案:

答案 0 :(得分:1)

我将您的问题解释为“如何将我的字符串列表分离为字符串列表,并根据由单个换行符组成的字符串的存在将它们分开?”。

您可以使用groupby来标识刚换行字符串和不刚换行字符串,并将每组不刚换行字符串追加到结果列表中:

list1 = [
    "foo", 
    "bar",
    "\n",
    "baz",
    "qux"
]

import itertools
result = []
for k,v in itertools.groupby(list1, key=lambda line: line=="\n"):
    #when k is true, v is a collection of newlines, which we don't care about.
    #so only append when k is false.
    if not k:
        result.append(list(v))

print(result)

结果:

[['foo', 'bar'], ['baz', 'qux']]

答案 1 :(得分:0)

您可以简单地执行以下操作: 假设list1包含您的输入数据

temp = list()
list2 = list()
for line in list1:
    if line == '\n':
        list2.append(' '.join(temp))
        temp = list()
    else:
        temp.append(line)   # cache elements until '\n'

您可以使用itertools.groupby将元素'\n'周围的元素分组:

from itertools import groupby

list2 = [''.join(group) for f, group in groupby(list1, lambda x: x == '\n') if not f]

如果您打印list2元素,则上述两种方法都应相同。