我试图筛选一个列表,其中有一个单词逐行,根据单词的长度(在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)但是输出文件保留了所有的单词。顺便问一下,有没有更有效的方法来做到这一点?
发布于 2018-11-23 19:13:39
&实际上只适用于位旋转,请使用and。and,因为比较可以被链接起来。(len(word)>=4 and len(word)<=8相当于4 <= len(word) <= 8)。.readlines(),这里我使用for line in fin:。无论哪种方式,产生的字符串都将以换行符结尾,因此您的长度度量将以1为结束。在取长度(len(line.strip()))之前,我通过剥行来纠正这一点。(编写的代码应该省略'be',但保留了'dog',因为它实际上是长度为4的'dog\n' )。'communication\n'和'be\n'。我可以想象,如果在文件中有额外的空格(由于有两个空格,'be\n'‘的长度为5),那么可能会保留'be \n。但是,在输出文件中保留'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)发布于 2018-11-23 19:02:52
这样做有不止一个选择。
检查文档这里。
让我们假设您有一个名为data的字符串列表,那么:
data = ['hello', 'communication', 'be', 'dog', 'test']
filtered_list = filter(lambda x: len(x) > 4 and len(x) < 8, data)
print(filtered_list)将返回:
Python 3.6.1 (default, Dec 2015, 13:05:11)
[GCC 4.8.2] on linux
>
['hello']您可以更改lambda函数以筛选不同的条件。过滤器将“捕获”返回True的每个元素。
这可能是实现这一目标的最短途径。只需要做:
filtered_list = [x for x in data if len(x) > 4 and len(x) < 8]发布于 2018-11-23 19:03:24
列表理解允许您选择要从哪些元素构造列表。下面是一个实现示例:
s = """
hello
communication
be
dog
test
"""
lst = [elm for elm in s.split() if (len(elm) >= 4 and len(elm) <= 8)]
print(lst)输出:
['hello', 'test']https://stackoverflow.com/questions/53451761
复制相似问题