列表理解中的Python if语句

时间:2013-03-04 10:22:15

标签: python if-statement for-loop

我有这行代码:

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 个答案:

答案 0 :(得分: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 :(得分: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。

答案 2 :(得分: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)]

列表理解中非常难看,我建议您使用此处建议的其他方法之一。