Python 列表推导中的 if 语句
我有这样一行代码:
bitext = [[sentence.strip().split()
for sentence in pair if len(sentence) < 100]
for pair in zip(open(c_data), open(e_data))[:opts.num_sents]]
c_data
是一个包含中文句子的文件。
e_data
是一个包含英文句子的文件。
bitext
应该是一个列表,里面包含成对的英文和中文句子,它们是彼此的翻译。
因为这两个数据文件都很大,
我想通过只考虑长度在一定范围内的句子来简化我的代码。这里的长度是用字符来计算的。
举个例子,
我在这里把长度设定为 100
。:opts.num_sents
是一个变量,表示应该考虑从数据文件中取多少个句子。
问题/错误
如果一个中文句子是95个字符,而一个英文句子是105个字符,bitext
只会更新中文句子。
但我希望代码只有在两个句子都在设定的长度范围内时,才添加这对句子。
我该怎么做呢?
3 个回答
1
我觉得你想做的可能是这个:
bitext = [[sentence.strip().split() for sentence in pair]
for pair in zip(open(c_data), open(e_data))[:opts.num_sents] if all(len(s) < 100 for s in pair)]
不过在列表推导式中,这样写看起来很难看。我建议你使用这里提到的其他方法。
2
现在我们来拆解一下这行代码:
def tokenize(sentence):
return sentence.strip().split()
def sentence_pairs(c_data, e_data):
for chinese, english in zip(open(c_data), open(e_data))[:opts.num_sents]:
if len(chinese) < 100 and len(english) < 100
yield tokenize(chinese), tokenize(english)
yield
这个关键词把 sentence_pairs
变成了一个生成器。如果你只是想逐个获取结果,这种写法会更简单:
def sentence_pairs(c_data, e_data):
results = []
for chinese, english in zip(open(c_data), open(e_data))[:opts.num_sents]:
if len(chinese) < 100 and len(english) < 100
results.append((chinese, english))
return results
1
首先,把你的代码写得更容易理解!列表推导式很好用,但当它们在页面的边缘消失时,就会变得很难理解。
bitext = [[sentence.strip().split() for sentence in pair if len(sentence) < 100] for pair in zip(open(c_data), open(e_data)) [:opts.num_sents]]
这基本上是和下面的代码一样的:
bitext = []
for i, pair in enumerate(zip(open(c_data), open(e_data))):
if i < opts.num_sents:
sentence_pair = []
for sentence in pair:
if len(sentence) < 100:
sentence_pair.append(sentence.strip().split())
if len(sentence_pair) > 1: # ie both sentences are < 100
bitext.append(sentence_pair)
现在,你想要添加长度大于 > 100
的句子。你可以看到这一行
if len(sentence) < 100:
正在阻止这个,所以把100改一下。