按字长过滤列表

时间:2018-11-23 18:57:59

标签: python list filter

我正在尝试根据单词的长度(4到8个字符)逐行过滤单词列表。这样,如果输入文件具有:

  • 你好
  • 交流
  • 测试

输出文件为:

  • 你好
  • 测试

所以我有以下代码:

dir = "lower.lst"
dict = open(dir, 'r').readlines()
f=open('dictionary','w')
for word in dict:
  if len(word)>=4 & len(word)<=8:
    f.write(word)
f.close()
print(len(dict))

print(f)

但是输出文件保留所有单词。 顺便问一下,有没有更有效的方法来做到这一点?

5 个答案:

答案 0 :(得分:2)

  • 使用with语句自动关闭文件(即使遇到异常)。
  • &在Python中实际上仅是用于微动,请使用and
  • 实际上不需要and,因为可以将比较链接起来。 (len(word)>=4 and len(word)<=8等效于4 <= len(word) <= 8)。
  • 在您的问题中,您使用.readlines(),在这里我使用for line in fin:。无论哪种方式,结果字符串都将以换行符结尾,因此您的长度测量值将减一。我通过在获取长度(len(line.strip()))之前删除行来纠正此问题。 (您编写的代码应该省略'be',但保留'dog',因为它实际上是'dog\n',长度为4)。
  • 您说过,您的代码保留了所有文字。在我看来,您的代码应该可以省略'communication\n''be\n'。我可以想象如果文件中的'be\n'后面如果有多余的空格('be \n'的长度为5,因为有两个空格),那么可能会保留它们。但是似乎没有逻辑的方法将'communication\n'保留在您的输出文件中。您可能要仔细检查它是否确实存在。

with open('lower.lst', 'r') as fin, open('dictionary', 'w') as fout:
    for line in fin:
        if 4 <= len(line.strip()) <= 8:
            fout.write(line)

答案 1 :(得分:1)

执行此操作有多种选择。

  1. 具有 filter()内置功能

检查文档CountVectorizer

假设您有一个名为 Function Last_NAS_Parse { $Import_IP = Import-Csv -Path "$destination_RAW_NAS\audit_nas_8_$((Get-Date).ToString('yyyy-MM-dd')).txt" -Header @("date","infohostname","Version","SMTP","Value_1","Value_2","Value_3","Value_4","Value_5","Value_6","Value_7","Value_8","Value_9") $Import_IP | ForEach-Object { if ( [string]::IsNullOrWhiteSpace($_.infohostname) } 的字符串列表,然后:

data

会返回:

data = ['hello', 'communication', 'be', 'dog', 'test']
filtered_list = filter(lambda x: len(x) > 4 and len(x) < 8, data)
print(filtered_list)

您可以更改lambda函数以过滤不同的条件。过滤器会“捕获”返回Python 3.6.1 (default, Dec 2015, 13:05:11) [GCC 4.8.2] on linux > ['hello'] 的每个元素。

  1. 具有列表理解

这可能是实现此目的的最短方法。只需要做:

True

答案 2 :(得分:0)

List comprehension确实允许您选择要从中构造列表的元素。这是一个示例实现:

....

ActionBar actionbar = getSupportActionBar();

try {
    actionbar.setDisplayHomeAsUpEnabled(true);
    actionbar.setHomeAsUpIndicator(R.drawable.icon_menu_white);
}
catch (NullPointerException err) {
    err.printStackTrace();
}

...

输出:

s = """
hello
communication
be
dog
test
"""

lst = [elm for elm in s.split() if (len(elm) >= 4 and len(elm) <= 8)]

print(lst)

答案 3 :(得分:0)

这是您要找的吗?在这里,我使用带有new Foo();保留字的文件上下文管理器,并且使用with代替注释中指出的and

&

要知道它是否会完全按照您的意图格式化,这有点困难。

答案 4 :(得分:0)

如果将public function event() { return $this->belongsToMany('App\Models\Booky\EventsModel', // Table name of the relationship's joining table. 'event_maps', // Foreign key name of the model that you are joining to 'map_id' // Foreign key name of the model on which you are defining the relationship 'event_id', ); } 替换为&,即:


and