◯◯ and ( or 複数）というような条件で調べたいが、or の条件が反映されない


CSV形式のファイルに対して、`◯◯ がある行` and `any()内のどれかの数字があるもの` というようにしたいのだが、`and
の前の条件で当てはまるもののみ`、または `◯◯` and `any内の最初の数字だけが該当するもの` というようなコードでしか作成できなかった。

"◯◯" があり 且つ "any内のどれか数字がある行" を探すにはどうしたらいいでしょうか？  
おそらくor の条件が反映されてません。

[code]

    if (("◯◯" in line) and (any(["8847450" or "3625014" or "3625037" or "8831472"])in line)):
    
[/code]

* * *

StackOverflowに投稿するのが初めてでコードの質問の仕方も全然わからないものです。  
医療機関のためあまり情報は出さないほうが良いかと思っておりましたが程々出します。

orという条件を反映させたいが反映されない。  
イメージとしては、SYがある行 且つ その行に
AかBかCかDかEの病名がある患者番号を出力するというのが目的です。自分ではorの使い方がまちがっているのではと思ってます。

[code]

    if ("SY") and ("A"or"B"or "C"or"D"or "E")in line:
    
[/code]

any や 下記のように試しましたが、SY行がある患者番号がSYがある数だけ出力されるだけでした。

[code]

    if "SY"in line and ("8847450"or"3625014"or "3625037"or"8831472"or
     "8847490"or"8849662"or"8837631"or"8837585"or"8842213"or"8841636"or"8830978"
     or"8840886"or"8840626"or"3627007"or"3671002"or"8833933"
     or"3623046"or"8840647"or"8845932"or"8841160"or"8847607"or"8847668"or"8849687"
     or"8840659"or"8840661"or"8849884"or"8846886"or"8842298"
     in line):
    
[/code]

* * *

### コードの全体

[code]

    from os import O_EXLOCK
    import pandas as pd
    import numpy as np
    import csv
    
    # データセットの読み込み
    #f = pd.read_csv('RECEIPTC.UKE', 'r', encoding="shift-jis")
    f=open("/Users/RECEIPTC.UKE", encoding="shift-jis")
    #'utf-8'
    
    ############################################################################
                                                                               #
                            #診療                                              #
    ############################################################################
    #if SY（病名）行　　に000000000がある
    #if "SI"(診療行為）行　and"00000000"がある
    
    """"""""""""""""""""""""""""""""""""""""""
    #自発蛍光
    """"""""""""""""""""""""""""""""""""""""""
    line_RE = False
    line_SY = False
    line_SI = False
    
    for line in f:
        # REが出てくるたびに患者名を格納、初期化
        if 'RE' in line:
            name = line.split(',')[13]
            line_RE = True
            line_SY = False
            line_SI = False
    
        #if SY2（病名）行　　に  等がある      
        if ("SY") and ("8847450"or"3625014"or "3625037"or"8831472"or
        "8847490"or"8849662"or"8837631"or"8837585"or"8842213"or"8841636"or"8830978"
        or"8840886"or"8840626"or"3627007"or"3671002"or"8833933"
        or"3623046"or"8840647"or"8845932"or"8841160"or"8847607"or"8847668"or"8849687"
        or"8840659"or"8840661"or"8849884"or"8846886"or"8842298")in line:
            line_SY  = True  # SYの該当あり判定
            print(name) 
        #自発蛍光　　160199310
        if("SI" and "160199310") in line:
            line_SI = True  # SIの該当あり判定
            #print(name) 
        """"""""""""""""""""""""
        #1879  4699 1221 4213 4687 3190 2982
        #4125 3782 3189 4161 3128
        """"""""""""""""""""""""
        if not (line_SY)  and line_SI :
            #print(name)  # 患者名出力
            """"""""""""""""""""""""
            #1879  4699 1221 4213 4687 3190 2982
            #4125 3782 3189 4161 3128
            """"""""""""""""""""""""
            line_RE = False
            line_SY = False
            line_SI = False
            # 初期化
        #break (breakがあると何も出てこなくなる)
    
[/code]

* * *

# 追記

2個あります 2個目は追加となります

### 1点目

@oriri さんのアドバイスを元にコードを編集したのですが  
下記コードにて 同じ患者番号が出るのは 該当 のid_list 内の番号に当てはまる番号が２個あるので患者番号も２個でるのでしょうか？  
例えば 「 > 」 の部分なのですが 2344は 病名（SY行に含まれている数字）に 8831472 が2個ありました（病名をつける際に、右 左等
修飾コード＋病名になるためです 例えば 右という意味の数字、8831472 や 左という意味の数字、8831472 になるため 一人の該当患者の
SY行複数個の中に 8831472 が2個あることになります そのため出力すると 2344が2個出力されるのでしょうか？  
しかし 2542 は同じ該当病名の数字がありませんでした これは、id_list 内の番号にあてはまるものが2つあるからでしょうか？
例えば"8847450","3625014" があったため等。

[code]

        #if SY2（病名）行　　に  等がある 
    
        id_list = ["8847450","3625014", "3625037","8831472",
        "8847490","8849662","8837631","8837585","8842213","8841636","8830978"
        ,"8840886","8840626","3627007","3671002","8833933"
        ,"3623046","8840647","8845932","8841160","8847607","8847668","8849687"
        ,"8840659","8840661","8849884","8846886","8842298"]
    
        if "SY" in line and any(id in line for id in id_list):
            line_SY  = True  # SYの該当あり判定
            #print(name) 
            #8831472  30件あるが出てこない
            """"""""""""""""""""""""
            #1879
            #3128  3816 4699 3218 2496 4213 4689
            #4687 4626 3870                      >2344 2344 (8831472)
            #                                    >4669 4669 (?)
            #3154 3190 4499 199 3074 2982 4108 
            #                                    >2542 2542 (?)
            #4125 3052 
            #                                    >3879 3879  (#8831472)
            #3782  
            #                                    >3189 3189 (?)
            #4488   
            #                                    >4161 4161  (8834556)
            #2987  3128
            """"""""""""""""""""""""
    
[/code]

### 2点目

同じコードを 例えば 輻輳のパターン、 自発蛍光 のパターンを下記のように続けて書くと  
自発蛍光だけのコードのときは出力されるものが何も出力されない  
break を入れましたが意味がなさそうです

[code]

    ############################################################################
                                                                               #
                            #診療                                              #
    ############################################################################
    
    
    #####◯◯◯◯◯◯◯◯！！！！輻輳◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯######
    line_RE = False
    line_SY = False
    line_SI = False
    for line in f:
        # REが出てくるたびに患者名を格納、初期化
        if 'RE' in line:
            name = line.split(',')[13]
            line_RE = True
            line_SY = False
            line_SI = False
    
        #if SY2（病名）行　　に3789001(斜視）等がある       
    
        id_list = ["3789001","3784001", "8831705","8844716",
        "3673004","8847774","3785017","3795003","3795019","8026003","8845049",
        "8845078","8838065","3785007","3785014","3675013"]
    
        if "SY" in line and any(id in line for id in id_list):
            line_SY  = True  # SYの該当あり判定
            #print(name) 
            #4357  4358
            #3784001→5件
            #1827  4338  4321 4341 4357 4319 567 4358 387
        if('SI' and '160083810') in line:
            line_SI = True  # SIの該当あり判定
            #print(name) 
            #4338  4321
            #4341  4357 4319  4358 387
            
            #if "SI"(診療行為）行　and"160083810"（輻輳）がある
    
        if not (line_SY)  and line_SI :
            #print(name)  # 患者名出力
            #4338  4321  4341 4319  387
            line_RE = False
            line_SY = False
            line_SI = False
            # 初期化
        break         
        
     
    """"""""""""""""""""""""""""""""""""""""""
    #自発蛍光
    """"""""""""""""""""""""""""""""""""""""""
    line_RE = False
    line_SY = False
    line_SI = False
    
    for line in f:
        # REが出てくるたびに患者名を格納、初期化
        if 'RE' in line:
            name = line.split(',')[13]
            line_RE = True
            line_SY = False
            line_SI = False
    
        
        
        #if SY2（病名）行　　に  等がある 
    
        id_list = ["8847450","3625014", "3625037","8831472",
        "8847490","8849662","8837631","8837585","8842213","8841636","8830978"
        ,"8840886","8840626","3627007","3671002","8833933"
        ,"3623046","8840647","8845932","8841160","8847607","8847668","8849687"
        ,"8840659","8840661","8849884","8846886","8842298"]
    
        if "SY" in line and any(id in line for id in id_list):
            line_SY  = True  # SYの該当あり判定
            #print(name) 
            #8831472  30件あるが出てこない
            """"""""""""""""""""""""
            #1879
            #3128  3816 4699 3218 2496 4213 4689
            #4687 4626 3870                      2344 2344 (8831472)
            #                                    4669 4669 (?)
            #3154 3190 4499 199 3074 2982 4108 
            #                                    2542 2542 (?)
            #4125 3052 
            #                                    3879 3879  (#8831472)
            #3782  
            #                                    3189 3189 (?)
            #4488   
            #                                    4161 4161  (8834556)
            #2987  3128
            """"""""""""""""""""""""
        #自発蛍光　　160199310
        if("SI" and "160199310") in line:
            line_SI = True  # SIの該当あり判定
            print(name) 
        """"""""""""""""""""""""
        #1879  4699 1221 4213 4687 3190 2982
        #4125 3782 3189 4161 3128
        """"""""""""""""""""""""
        if not (line_SY)  and line_SI :
            #print(name)  # 患者名出力
            """"""""""""""""""""""""
            #1221のみになった
            """"""""""""""""""""""""
            #1879  4699 1221 4213 4687 3190 2982
            #4125 3782 3189 4161 3128
            """"""""""""""""""""""""
            line_RE = False
            line_SY = False
            line_SI = False
            # 初期化
    
        break 
        # (breakがあると何も出てこなくなる)
    
[/code]




よく問題を理解できていないだけかもしれませんが、  
Pythonのany()はTrueかFalseを返すと思います。  
（数字の場合は０以外、Booleanの場合はTrueがリストの中に一つでもあればTrueを返します。）

ですので、上記されているコードでは、

[code]

    any(["8847450" or "3625014" or "3625037" or "8831472"]
    
[/code]

この部分はTrueしか返っておらず、結果として

[code]

    if (("◯◯" in line) and　(True in line)):
    
[/code]

となっており、調べたいことに合致していないと思います。

ですので、もし全ての番号がわかっておられるのであれば、  
簡単に

[code]

    OKIDs = ["8847450","3625014","3625037","8831472"]
    if ("◯◯"in line):
      for id in OKIDs:
        if id in line:
          XXXXXX <- ABCDFさんがやりたいこと
    
[/code]

しておけば大丈夫なような気がします。  
ただし、この場合はlineに”88474501”のような似ている数字が存在する場合も条件に引っかかります。

なので、より細かな条件で調べたいのであれば、  
lineの中から、まずは"◯◯"や特定の数字を抜き取ってくる作業を行なった後  
if statementにするのがよいかと思いますよ。

