如何从python中的列表的特定部分开始检查

时间:2016-02-02 19:38:24

标签: python list arraylist

鉴于以下列表:

$('.delete').on('click', function(e) {
  var $this = $(this);
  $this.parent().remove();
  //how to get the <tr> that just deleted
 alert("deleted" +tr-value-deleted);
});

我想首先找到#

的特定行

例如:#923

然后打印所有以*为前缀的数字,直到下一次出现以#。

开头的行

这是我尝试的但是它不起作用:

#123
*21
*23
*56
*1
*3
#923
*21
*23
*56
*1
*3
#165
...

它打印*并打开以#开头的行,但问题是它从第一行开始而不是从包含#923的行开始。

我将不胜感激任何帮助和提示!

4 个答案:

答案 0 :(得分:4)

您可以使用itertools.dropwhile删除行,直到找到您想要的行然后循环,直到您得到以#开头的行

from itertools import dropwhile   
def section(fle, start, stop):
    with open(fle) as f:
        # consume lines until we get to our start line
        drop = dropwhile(lambda x: x.strip() != start, f)
        # skip start
        next(drop, "")
        # loop starting at line after start line
        for line in drop:
            # if we reach stop line break
            if line.startswith(stop):
                break
            # else we just yield the line
            yield line.rstrip()

输出:

In [4]: list(section("in.txt", "#923", "#"))
Out[4]: ['*21', '*23', '*56', '*1', '*3']

从开始开始处理多个部分,并以#开头的行分隔:

from itertools import dropwhile, groupby


def section(fle, start, end):
    with open(fle) as f:
        grps = groupby(dropwhile(lambda x: x.strip() != start, f),
                       key=lambda x: x.startswith(end))
        for k, v in grps:
            if not k:
                yield list(map(str.strip,v))

演示:

n [13]: cat in.txt
(4.471719725275173E-003,2.163649191486555E-002)
(6.471719725275173E-003,2#123
*21
*23
*56
*1
*3
#923
*21
*23
*56
*1
*3
#165.163649191486555E-002)
*210
*230
*560
*10
*30
#165.163649191486555E-002)
In [14]: list(section("in.txt", "#923", "#"))
Out[14]: [['*21', '*23', '*56', '*1', '*3'], ['*210', '*230', '*560', '*10', '*30']]

答案 1 :(得分:1)

也许是这样的:

data = ( "#123", "*21", "*23", "*56", "*1", "*3", "#923", "*21", "*23", "*56", "*1", "*3", "#16a" )

for idx,num in enumerate(data):
    if num == "#923":
        break
    #
#
for num in data[idx + 1:]:
    if num[0] == '#':
        break;
    #
    print num
#

给出:

*21
*23
*56
*1
*3

答案 2 :(得分:1)

不需要让事情变得更复杂。只需使用两个for循环:

with open(yourFile) as fp:

    for line in fp:
        if line.startswith('#923'):
            break

    for line in fp:
        if line.startswith('#'):
            break
        if line.startswith('*'):
            print line

如果您的数据已经是一个列表,那么:

    it = iter(yourList)

    for line in it:
        if line.startswith('#923'):
            break

    for line in it:
        if line.startswith('#'):
            break
        if line.startswith('*'):
            print line

答案 3 :(得分:0)

请注意,在找到#923之前不要抑制输出,也不测试它。因此,您将获得您找到的第一个#。

请注意,您的for循环显示for i in data:,其中包含第一行。您需要有一个标志来确定这是第一次还是第二次。请注意,第一次进入循环时,您测试的第一个条目是#条目,因此您将中断。

你应该做什么(而不是休息)是创建一个新的歌曲列表,每次你获得新的#条目。将每首*歌曲附加到列表中。然后你会得到一起合唱的歌曲列表。

你知道你将歌曲视为一个字符串,你从来没有初始化它所以添加到字符串songs += ndata[0] = "\n将会失败。

此外,数据中的最后一行是#(最后会创建一个空歌曲列表)?如果您只是添加一个字符串,它将自行退出。

如果你想每次都做一个单独的歌曲列表,请使用带有yield而不是返回歌曲列表(或字符串)的生成器