60202


私は、人材募集広告から文字列検索をし、カテゴリー分けをしています。  
不揃いな言葉の中からカテゴリー分けをしているのですが、if
構文で以下のようにorで3つ分けてしまうと、返り値が、すべて"物流STAFF"になってしまいます。

この現象がなぜ起こっているかご指導をお願いします。

[code]

    【sample】
    work_explain = '【シール貼り/おまけ付け】登録制★来社不要のWEB登録♪日払い'
    work_explain = '【倉庫内作業】登録制「Wワーク・学校の合間を有効活用◆'
    
    def work_category(work_explain):
    
        works = ['箱詰め','組付','袋詰め','検査','資材運搬','ガスの充填',
        '包装','景品交換','品質管理','ドライバー助手','鮮魚スタッフ','配送アシスタント',
    　　'食品加工','調理補助','荷下ろし', '荷捌き',　'資材運搬','施工管理','地盤改良',
    '中古住宅インスペクション','清掃','地盤調査','物流STAFF','タオルたたみ','ペットボトルの分別']
    
        if "箱づめ" in work_explain:
            work_explain = '箱詰め'
        if "品だし" in work_explain:
            work_explain = '品出し'
    
        if "資材運び" or "資材を運ぶ" in work_explain:
            work_explain = '資材運搬'
        if '工場STAFF' or '物流倉庫' or '倉庫業務' or '工場staff' or '倉庫内作業' in work_explain:
            work_explain = '物流STAFF'
    
        for i in works:
            if i in work_explain:
                work = i
    
    　　 return work
    
[/code]


CC BY-SA 4.0
2019-11-02T01:06:19.133
60197
2019-11-02T08:50:12.370
2019-11-02T08:50:12.370
31870
question
python
pythonのif構文でor使用時に、orが3つある最初にある分岐が優先されてしまう


コメントで紹介した1つ目の記事を元に考えると以下の行は、

[code]

    if "資材運び" or "資材を運ぶ" in work_explain:
    
    if '工場STAFF' or '物流倉庫' or '倉庫業務' or '工場staff' or '倉庫内作業' in work_explain:
    
[/code]

この形と判断され、最初が文字列定数なので必ず`True`になり、'資材運搬'も'物流STAFF'も順番に代入されて、最後の`if`で代入された'物流STAFF'が有効になります。

[code]

    if ("資材運び") or ("資材を運ぶ" in work_explain):
    
    if ('工場STAFF') or ('物流倉庫') or ('倉庫業務') or ('工場staff') or ('倉庫内作業' in work_explain):
    
[/code]

コメントで紹介した2つ目の記事の対策を適用すると以下のようになります。

[code]

    work_explain1 ='【シール貼り/おまけ付け】登録制★来社不要のWEB登録♪日払い'
    work_explain2 ='【倉庫内作業】登録制「Wワーク・学校の合間を有効活用◆'
    work_explain3 ='Webコンテンツの品質管理を行う部署'
    work_explain4 ='お掃除・片付けが主な作業です デパート内で軽い資材運び 装飾品の片付け'
    
    def work_category(work_explain):
    
        works = ['箱詰め','組付','袋詰め','検査','資材運搬','ガスの充填',
        '包装','景品交換','品質管理','ドライバー助手','鮮魚スタッフ','配送アシスタント',
        '食品加工','調理補助','荷下ろし', '荷捌き','資材運搬','施工管理','地盤改良',
        '中古住宅インスペクション','清掃','地盤調査','物流STAFF','タオルたたみ','ペットボトルの分別']
    
        if  '箱づめ' in work_explain:
            work_explain = '箱詰め'
        if  '品だし' in work_explain:
            work_explain = '品出し'
    
        if any(map(work_explain.__contains__, ('資材運び','資材を運ぶ'))):  # 記事適用
            work_explain = '資材運搬'
        if any(map(work_explain.__contains__, ('工場STAFF','物流倉庫','倉庫業務','工場staff','倉庫内作業'))):  # 記事適用
            work_explain = '物流STAFF'
    
        work = ''  # あらかじめforの外で宣言・初期化が必要なはず
        for i in works:
            if i in work_explain:
                work = i
    
        return work
    
    print(work_category(work_explain1))  # 何も合致しないので空文字列
    print(work_category(work_explain2))  # 物流STAFF
    print(work_category(work_explain3))  # 品質管理
    print(work_category(work_explain4))  # 資材運搬
    
[/code]


CC BY-SA 4.0
2019-11-02T03:19:14.380
60199
2019-11-02T07:22:14.243
2019-11-02T07:22:14.243
26370
26370
60197
answer


本題とは無関係な事ですが、カテゴリーを追加していく度に条件分岐の記述が増える事になりますので、カテゴリーリストの様なモノを作成すると良いかと思います。また、複数のカテゴリーに一致する場合には、全てのカテゴリーを列挙する方が適切ではないでしょうか。

[code]

    ## { category: [keyword, ...], ... } 
    WORK_CATEGORIES = {
      '箱詰め': ['箱づめ'],
      '品出し': ['品だし'],
      'シール貼り': ['シールはり'],
      '資材運搬': ['資材運び', '資材を運ぶ'],
      '物流STAFF': [
        '物流staff', '工場staff', '工場STAFF', '物流倉庫',
        '倉庫業務', '倉庫内作業',
      ],
    }
    
    def get_work_category(work_explain):
      return [
        category for category, keywords in WORK_CATEGORIES.items() for word in keywords
        if word in work_explain or category in work_explain
      ]
    
    
    if __name__ == '__main__':
    
      explains = [
        '【シール貼り/おまけ付け】登録制★来社不要のWEB登録♪日払い',
        '【倉庫内作業】登録制「Wワーク・学校の合間を有効活用◆」',
        '【資材運び】物流倉庫/要フォークリフト免許',
        '【引越し】単発1日作業、その日払い',
      ]
    
      for exp in explains:
        c = get_work_category(exp)
        print('{}\n=> {}\n'.format(exp, ','.join(c) if c else 'None matches.'))
    
[/code]

**実行結果**

[code]

    【シール貼り/おまけ付け】登録制★来社不要のWEB登録♪日払い
    => シール貼り
    
    【倉庫内作業】登録制「Wワーク・学校の合間を有効活用◆」
    => 物流STAFF
    
    【資材運び】物流倉庫/要フォークリフト免許
    => 資材運搬,物流STAFF
    
    【引越し】単発1日作業、その日払い
    => None matches.
    
[/code]


CC BY-SA 4.0
2019-11-02T05:03:27.533
60202
2019-11-02T08:45:26.920
2019-11-02T08:45:26.920
60197
answer