Проверьте, существует ли массив подстрок в массиве строк - PullRequest
0 голосов
/ 26 марта 2020

У меня есть немного сложный вопрос (из-за моего ограниченного знания Python) о том, чтобы выполнить итерацию и проверить массив на предмет пропущенных значений.

У меня есть массив ключевых строк, и мне нужно проверить массив содержит все подстроки в другом массиве. Если это не так, мне нужно вывести отсутствующие данные.

Пример:

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

Мой идеальный вывод - сказать, что все элементы array2 существуют в array1, если они делают, или иначе в примере выше, чтобы вывести No key for value: four

Ответы [ 5 ]

2 голосов
/ 26 марта 2020

Этого можно достичь, перебирая список подстрок 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")

В случае, если вы не знакомы с предложением else в for, это будет выполнено только тогда, когда l oop завершится нормально, т.е. не будет выполнено, если break используется для завершения l oop рано.

Если вы хотите записать все подстроки, которых не было:

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 голос
/ 26 марта 2020

Это метод, который я смог сделать для вашего вопроса,

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")
0 голосов
/ 26 марта 2020
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")
0 голосов
/ 26 марта 2020
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')
0 голосов
/ 26 марта 2020

В одной строке:

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"
)
...