92901


1.csvの用語が1.txtの配列の中に含まれている配列の数を求めるプログラムを作成しています.現段階でcountメソッドを用いて1.txtに含まれる用語の個数を出力させました.しかし、用語数では無く、用語が含まれている配列の個数を求めたいのですがcountメソッドと配列のつなげ方が分からなかったので教えて頂きたいです.つまり、以下のような結果になればと考えています.  
**2.csv**

[code]

    first,2,1234
    second,1,2345
    
[/code]

**ソースコード**

[code]

    def main():
        # IDと単語のかかれたCSVを１行ずつの配列
        with open('1.csv','r') as a:
            rows = a.readlines()
        a.close()
    
        # 探す文章をまるごと１つの文字列に入れる
        with open('1.txt','r') as b:
            text=b.read()
            b.close()
    
        
        id_count = {}
    
        with open('2.csv','w') as c:
            c.write('用語, 回数, id\n')
            for row in rows:
                # id,word という文字列を , で分割
                tmp = row.split(',')
                id = tmp[0]
                # 改行を取り除くのとcsvの用語を全て小文字にする
                word = tmp[1].strip().lower()
                # textを小文字にし、text に word が何回入ってるか数える
                count = text.lower().count(word)
                #textにもし共通用語がなかったら出力しない
                if count==0:
                    pass
                else:
                    c.write('%s,%d,%s\n' % (word, count, id))
                
        c.close()
    
    if __name__ == '__main__':
        main()
    
[/code]

**1.txt**

[code]

    ['I was first.', 'I was first.']
    [' I was first.', 'I was second .']
    
[/code]

**1.csv**

[code]

    1234,first
    2345,second
    
[/code]


CC BY-SA 4.0
2022-12-19T11:24:51.100
92898
2022-12-23T09:17:09.853
54656
question
python python3
txtとcsvの共通している用語が含まれている配列の個数を求める


質問者さんの言う「配列」の意味は分かりませんが、1.txtの各行に1.csvの単語（"first","
second"）が含まれているかどうかをチェックして含まれている行数をカウントする、と解釈して2重ループを使った実装にしました。

[code]

    def main():
        # IDと単語のかかれたCSVを１行ずつの配列
        with open('1.csv','r') as a:
            rows = a.readlines()
    
        # 探す文章をまるごと１つの文字列に入れる
        with open('1.txt','r') as b:
            text=b.read()
    
        texts = text.split("\n")
        with open('2.csv','w') as c:
            c.write('用語, 回数, id\n')
            for row in rows:
                row = row.strip()
                count = 0
                for t in texts:
                    t = t.lower()
                    if row.strip().split(",")[1] in t:
                        count = count + 1
                c.write(",".join([row.split(",")[1], str(count), row.split(",")[0]]))
                c.write("\n")
                        
    if __name__ == '__main__':
        main()
    
[/code]


CC BY-SA 4.0
2022-12-19T12:52:32.353
92901
2022-12-19T12:52:32.353
39819
92898
answer


ファイル読み込み部分など, 一部変更しています

[code]

    import csv
    import io
    
    with io.StringIO(f1_csv) as fp:
        rows = list(csv.reader(fp))
    with io.StringIO(f1_txt) as fp:
        text = fp.read()
    
    lst = text.split('\n')   # [ast.literal_eval(p) for p in text.split('\n')]
    
    with open('2.csv', 'w') as c:
        c.write('用語, 回数, id\n')
        for row in rows:
            cnt = sum(row[1] in v for v in lst)
            if cnt:
                c.write('{},{},{}\n'.format(row[1], cnt, row[0]))
    
    !cat 2.csv
    用語, 回数, id
    first,2,1234
    second,1,2345
    
[/code]

#### 追記

① `.count` メソッドについて

[テキストシーケンス型 --- str](https://docs.python.org/ja/3/library/stdtypes.html#text-
sequence-type-str) の
[文字列メソッド](https://docs.python.org/ja/3/library/stdtypes.html#string-methods)

> `str.count(*sub*[, *start*[, *end*]])`  
>  [ _start_ , _end_ ] の範囲に、部分文字列 _sub_ が重複せず出現する回数を返します。オプション引数 _start_ および
> _end_ はスライス表記と同じように解釈されます。

[シーケンス型 --- list, tuple,
range](https://docs.python.org/ja/3/library/stdtypes.html#sequence-types-list-
tuple-range)

> `s.count(x)`  
>  `s` 中に `x` が出現する回数

文字列内から部分文字列探索するなら, 質問にあるコードで可能ですが,  
リスト内に項目が含まれているかどうかは, 正確に `"['I was first.', 'I was first.']"`
のように項目全体示さないとヒットしない。対象の文字列項目が存在すればカウントされます

部分文字列を含む項目をカウントするなら, そのようにコード化が必要

その場合は, `in` 演算子, `find`, `index`, `count` など各種メソッドがあるので適したものを選択する必要があります。また,
`re` モジュールなども存在します。

存在するか調べるだけなら `in` 演算子が(たいてい) **最速**

* * *

② 質問の `1.txt` について

どのように扱いたいのかはっきりしない

  * 行単位の文字列のリスト, 2項目
  * リスト内のリスト, 4項目の文字列

想定している結果から察すると, 行単位の文字列のリストと思われるが  
もしも 4項目, リスト内のリストの構造ならば, コードも変わってきます

[code]

    import ast
    import csv
    
    with open(f1_csv) as fp:
        rows = list(csv.reader(fp))
    with open(f1_txt) as fp:
        text = [ast.literal_eval(ln) for ln in fp]
    
    with open('2.csv', 'w') as c:
        c.write('用語, 回数, id\n')
        for row in rows:
            cnt = sum(any(row[1] in item for item in ln)
                                            for ln in text)
            if cnt:
                c.write('{},{},{}\n'.format(row[1], cnt, row[0]))
    
[/code]


CC BY-SA 4.0
2022-12-19T13:23:40.653
92902
2022-12-23T09:17:09.853
2022-12-23T09:17:09.853
43025
43025
92898
answer