2

数千の短い文字列を含むリストと、数十万の短い文字列を含む.csvファイルがあります。すべてのリスト要素は一意です。.csvファイルの文字列ごとに、複数のリスト要素が含まれているかどうかを確認する必要があります。

例えば。私は文字列を持っています:

example_string = "mermaids have braids and tails"

そしてリスト:

example_list = ["me", "ve", "az"]

明らかに、サンプル文字列には複数のリスト項目が含まれています。私とve。私のコードはこれを示す必要があります。ただし、リストが

example_list = ["ai", "az", "nr"]

リスト要素は1つだけ含まれています。

次のコードは、.csvファイルの各行に少なくとも1つのリスト要素が含まれているかどうかを確認すると思います。ただし、複数の異なるリスト要素が含まれているかどうかはわかりません。

data = file("my_file_of_strings.csv", "r").readlines()
for line in data:       
    if any(item in my_list for i in line):
        #Do something#
4

4 に答える 4

2
with open("my_file_of_strings.csv", "r") as data:
    for line in data:       
        if any(item in i for i in line.split() for item in my_list):
            ...

それらを数える必要がある場合は、sum()

with open("my_file_of_strings.csv", "r") as data:
    for line in data:       
        result = sum(item in i for i in line.split() for item in my_list):
于 2012-11-27T23:34:19.503 に答える
1
def contains_multiple(string, substrings):
    count = 0

    for substring in substrings:
        if substring in string:
            count += 1
            if count > 1:
                return True

    return False

for line in data:
    if contains_multiple(line, my_list):
        ...

短くはありませんが、2番目の一致が見つかるとすぐに終了します。これは重要な最適化である場合とそうでない場合があります。

于 2012-11-27T23:34:22.057 に答える
0

何かのようなもの:

data = file("my_file_of_strings.csv", "r").readlines()
for line in data:       
    if len(set(item for item in my_list if item in line)) > 1:
        #Do something#
于 2012-11-27T23:35:23.150 に答える
0

他の解決策があなたの目的にはより良いと思いますが、ヒット数とそれらがどれであったかを追跡したい場合は、これを試すことができます:

In [14]: from collections import defaultdict

In [15]: example_list = ["me", "ve", "az"]

In [16]: example_string = "mermaids have braids and tails"

In [17]: d = defaultdict(int)

In [18]: for i in example_list:
   ....:     d[i] += example_string.count(i)
   ....:

In [19]: d
Out[19]: defaultdict(<type 'int'>, {'me': 1, 'az': 0, 've': 1})

次に、一意の一致の総数を取得するには、次のようにします。

In [20]: matches = sum(1 for v in d.values() if v)

In [21]: matches
Out[21]: 2
于 2012-11-27T23:57:19.920 に答える