部分文字列の配列がすべて文字列の配列に存在するかどうかを確認します

2020-03-26 python arrays loops iterator substring

配列を反復処理して欠損値がないかどうかを確認することについて、(Pythonの限られた知識のために)少し複雑な質問があります。

キー文字列の配列があり、配列に別の配列のすべての部分文字列が含まれていることを確認する必要があります。そうでない場合は、不足しているものを出力する必要があります。

例:

array1 = ['key/value/one123904', 'key/value/two342389', 'key/value/three234093']
array2 = ['one', 'two', 'three', 'four']

私の理想的な出力は、すべての要素と言うことであろうarray2内に存在するarray1彼らが行う場合、または他の上記の例では、出力にNo key for value: four

Answers

あなたは部分文字列のリストを反復処理することによって、これを達成できるarray2 、およびかどうかをテストany中のキーの文字列のarray1 、この部分文字列が含まれている、すなわち:

for string in array2:
    if not any(string in key_string for key_string in array1):
        print("No key for value: " + string)
        break                                                                   
else:                                                                           
    print("All elements of array2 exist in array1")

forelse句に慣れていない場合、これはループが正常に終了したときにのみ実行されます。つまり、 breakを使用してループを早期に終了した場合は実行されません。

存在しない部分文字列をすべて記録したい場合:

missing = [string for string in array2                                          
           if not any(string in ks for ks in array1)]                           
if missing:                                                                     
    for string in missing:                                                      
        print("No key for value: " + string)                                    
else:                                                                           
    print("All elements of array2 exist in array1")

1行で:

print(
    "No key for value(s): {}".format(
        " ".join([k for k in array2 if not any(k in v for v in array1) ])
    )
)

または、すべての値が存在する場合をより適切に処理したい場合

no_match = [k for k in array2 if not any(k in v for v in array1) ]
print(
    "No key for value(s): {}".format(" ".join(no_match))
    if no_match
    else "All keys have values"
)
array1 = ['key/value/one123904', 'key/value/two342389', 'key/value/three234093']
array2 = ['one', 'two', 'three', 'four']


def does_match_in_array_of_string(key: str, search_list : list) -> bool:
    for item in search_list:
        if key in item:
            return True
    return False;


match_failures = [key for key in array2 if not does_match_in_array_of_string(key, array1)]

if len(match_failures):
    print(f'No key for values: {match_failures}')
else:
    print('All keys have values')

これは私があなたの質問のために作ることができた方法です、

def missing(arr1, arr2):
    #arr1 is the array of strings to be searched
    #arr2 is the array of substrings
    notFound=""
    for i in arr2: # i = each element in array 2
        for j in arr1: # j = each element in array 1
            if i in j: # if substring of i is in an element in j
                break # moves onto next element in the array
            elif j == arr1[-1]: # if not found in the string, checks if  on the last item in the array.
                notFound = notFound+" "+i
    if notFound != "":
        print("No key for value:", notFound)
    else:
        print("all elements of array2 exist in array1")
sum_array1 =""
for string1 in array1:
    sum_array1 = sum_array1 + string1 + ","
missing = [string2 for string2 in array2 if string2 not in sum_array1]
if missing:                                                                     
    for string in missing:                                                      
        print("No key for value: " + string)                                    
else:                                                                           
    print("All elements of array2 exist in array1")

Related