【问题标题】:Avoiding duplicating line of code by using "or" operator" does not give the same results as when duplicating the line通过使用“或”运算符来避免重复代码行不会得到与复制行时相同的结果
【发布时间】:2020-09-10 15:20:44
【问题描述】:

我有 3 个不同单词的列表。一个词可以在多个列表中。我还有一个句子列表。我所做的是:我检查句子中特定索引处的单词是否存在于上述单词列表之一中,如果“是”,则附加该句子。我用了两种方式。

第一种方法是:

我为其中一个单词列表编写代码并复制它,但只更改列表的名称和附加句子的变量

if (pattern_list_tup[pat][2]):
                    if (span[value_of_attribute[pat]] in lexique_1[pattern_list_tup[pat][1]]):
                        if sent not in sentence_extract_lexique_1:
                             sentence_extract_lexique_1.append(sent)                            
                    else:
                        sentence_not_extract_lexique_1.append(sent)

if (pattern_list_tup[pat][2]):
                    if (span[value_of_attribute[pat]] in lexique_2[pattern_list_tup[pat][1]]):
                        if sent not in sentence_extract_lexique_1:
                             sentence_extract_lexique_2.append(sent)                            
                    else:
                        sentence_not_extract_lexique_2.append(sent)

if (pattern_list_tup[pat][2]):
                    if (span[value_of_attribute[pat]] in lexique_3[pattern_list_tup[pat][1]]):
                        if sent not in sentence_extract_lexique_1:
                             sentence_extract_lexique_3.append(sent)                            
                    else:
                        sentence_not_extract_lexique_3.append(sent)

如您所见,我复制了第一行代码并将其用于其他列表(lexique)。我所做的是决定打印“三个列表的并集”。

如下:

Lists = [sentence_extract_lexique_1, sentence_extract_lexique_2, sentence_extract_lexique_3]
    
    all_union = set.union(*map(set, Lists))
    print("Union des 4 dictionnaires pour phrases extraites", len(all_union), "\n")

# Union des 4 dictionnaires pour phrases extraites  1003     

然后我想出了另一种方法来不重复第一行:我使用运算符“或”,如下所示:

 if (pattern_list_tup[pat][2]):
                    if (span[value_of_attribute[pat]] in lexique_1[pattern_list_tup[pat][1]] or lexique_2[pattern_list_tup[pat][1]] or lexique_3[pattern_list_tup[pat][1]] :
                        #print(span[value_of_attribute[pat]])
                        if sent not in sentence:
                            sentence.append(sent)                     
                    else:
                        sentence_not.append(sent)

在这行代码之后我决定打印结果,但在打印之前,我使用“set”来抑制双精度。

print(" phrases totales ", len(sentence))

# phrases totale 1996

sentence = set(sentence)
print("Total après suppression ", len(sentence))

Total après suppression 1556

我想知道为什么结果不同,使用“或”然后删除双标应该会得到与第一种方法相同的结果(我相信)。也许有人可以帮我弄清楚原因;我使用第二个来展示我的作品,但之后我重新检查代码并进行改进,我使用“或”;如果两个答案不相同,这是否意味着我的第一个解决方案是错误的,或者第二个解决方案是正确的。

【问题讨论】:

    标签: python python-3.x list if-statement tuples


    【解决方案1】:

    你不能这样使用“或”:

    if (span[value_of_attribute[pat]] in lexique_1[pattern_list_tup[pat][1]] or lexique_2[pattern_list_tup[pat][1]] or lexique_3[pattern_list_tup[pat][1]] :
    

    你必须这样做

    if a in b or a in c....
    

    或者你可以这样做

    for _list in [b, c]:
        if a in _list:
            ....
    

    第三种方法是将所有这些代码包装在一个函数中,并使用 3 个列表中的每一个调用此函数。

    顺便说一句,doublon 在英语中被翻译为重复。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-22
      • 2011-08-09
      • 2019-02-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多