使用list comprehnsion跳过2行

时间:2017-08-07 12:03:24

标签: python list-comprehension

我试图利用列表理解来从非常大的文件中对数据进行排序。文件结构如下:

<div class="control-group">
        <label class="control-label" for="form-field-1">Network</label>
            <div class="controls">
                <select id="a_network"  name="a_network" onchange="getplan();">
                    <option>Choose Network</option>
                        <?php 
                            $q=mysql_query("select * from network");
                            while($rq=mysql_fetch_array($q))
                            {
                        ?>
                                <option value="<?php echo $rq['id'];?>"><?php echo $rq['network_name'];?></option>
                        <?php
                            } 
                        ?>
                </select>
            </div>
    </div>

    <div class="control-group">
        <label class="control-label" for="form-field-1">Plan</label>
        <div class="controls">
                <select id="plan"  name="plan"></select>
        </div>
    </div>

    <script>
    function getplan()
    {
    var network_id = $("#a_network").val();
    $("#plan").empty();

            if(network_id != ''){
                $.ajax({
                    type: "post",
                    url: "getPlanbyNetworkID.php",
                    data: {network_id: network_id},
                    dataType: "html",
                    success: function(data) {
                        $("#plan").append(data);
                });
            }
    }
    </script>

......等等。

基本上尝试将所有info1收集到一个列表中,将所有info2收集到另一个列表中。我有一个以前的脚本,这样做,但它很慢。我也试图使其面向对象,这样我就可以更有效地使用数据。

旧脚本:

<?php 
        $network_id = $_POST['network_id'];

        $q=mysql_query("select * from sim_plans where network_id='$network_id'");
    $dropdown = '<option>Choose Plan...</option>';
        while($rq=mysql_fetch_array($q))
        {
    $dropdown .=  '<option value="' . $rq['plan_id'] . '">' . $rq['plan'] . '</option>';
        }
echo $dropdown;
    ?>

新脚本:

THING
info1
info2
info3
THING
info1
info2
info3

新脚本适用于将info1_data作为列表获取。但是,要获取info2_data,我找不到使用此方法跳过2行的任何内容。我猜到了info1_data = [] info2_data = [] with open(myfile) as f: for line in f: if re.search('THING',line): line=next(f) info1_data.append(line) line=next(f) info2_data.append(line) 。它运行但没有产生任何东西。

这可能吗?

非常感谢。

在摩西的帮助下我找到了这个解决方案。但islice非常令人困惑,即使在阅读了python.docs之后我也完全不了解它。 iterable是否获取数据(即info1或info2)或者启动,停止和步骤是否指示提取哪些数据?

islice(可迭代,开始,停止[,步骤])

def __init__(self, file):
    self.file = file

def sort_info1(self):
    with self.file as f:
        info1_data = [next(f) for line in f if re.search('THING',line)]
    return info1_data

def sort_info2(self):
    with self.file as f:
        info2_data = [next(f).next(f) for line in f if re.search('THING',line)]
    return info2_data

2 个答案:

答案 0 :(得分:2)

您应该将seek文件返回到开头,以便从文件开头重复搜索。此外,您可以使用生成器函数将搜索操作与数据生成分离。然后使用itertools.islice跨越行:

from itertools import islice

class SomeClass(object):
    def __init__(self, file):
        self.file = file

    def search(self, word):
        self.file.seek(0) # seek to start of file
        for line in self.file:
            if re.search(word, line):
                # yield next two lines
                yield next(self.file)
                yield next(self.file)

    def sort_info1(self):
        return list(islice(self.search('THING'), 0, None, 2))

    def sort_info2(self):
        return list(islice(self.search('THING'), 1, None, 2))

然而,我建议您不要传递文件,而是将路径传递给文件,以便每次使用后文件都可以关闭,以避免在资源不足时(或者尚未)。

答案 1 :(得分:1)

你可以这样做:

def sort_info2(self):
    with self.file as f:
        info2_data = [(next(f),next(f))[1] for line in f if re.search('THING',line)]
    return info2_data

但它看起来有点奇怪!