Python, поиск подстроки не в DICT без L oop в одной строке - PullRequest
0 голосов
/ 25 марта 2020
# Get version stack ID
for key in all_version_stacks.keys():
    if "040_ALY_040_HROTERRORBLADE_prev" in key:  # Search for the filename with substring in Version Stack
        print('Found the Version Stack Name: ', key)
        version_stack_upl_id = all_version_stacks.get(key)
        print('Version Stack ID:             ', version_stack_upl_id)
   else:
        print('Version Stack not found')

Моя проблема в том, что я не хочу получать результат:

Version Stack not found
Version Stack not found
Version Stack not found
Version Stack not found

Я хочу знать, существует ли он там, и если да, я хочу получить ключ.

version_stack_upl_id = all_version_stacks.get(key)

И если нет, я хочу просто получить false или возврат одной переменной. Но так как мне нужно для l oop выше, я всегда получаю печать или возврат для каждого ключа. Я не могу решить эту проблему.

Я все еще учусь, поэтому я надеюсь, что кто-то из вас может дать мне несколько умных советов, как это решить.

Не имеет значения как я это делаю, я всегда заканчиваю тем, что использую для поиска l oop, поскольку я хочу использовать подстроку для поиска , потому что я не хочу искать полный ключ.

def search(target_dict, searchFor):
    for version_stack_name in target_dict:
        searchFor not in version_stack_name

Ответы [ 3 ]

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

Я не думаю, что oop без одной строки - правильное решение для вас; это только усложнит понимание кода.

Если ваша проблема получает ответ «не найден» для каждого ключа, а не в целом, то вам просто нужно переместить свой «не найден» за пределы л oop. Таким образом, он будет отвечать только один раз, если соответствующий ключ не найден.

Я написал пример функции ниже

my_dict = {"AAA": 1, "BBB": 2, "CCC": 3}  # example dict

def get_key_by_substring(sub_key, store):

    for key in store.keys():  # loop through the keys
        if sub_key in key:  # if the substring is found
            return key  # return the key

    # if the substring isn't found in any key 
    return "not found" # return "not found"

print(get_key_by_substring("B", my_dict))  # returns "BBB"
print(get_key_by_substring("D", my_dict))  # returns "not found"
1 голос
/ 25 марта 2020

Вы можете использовать флаг:

# Get version stack ID
key_found = False
for key in all_version_stacks.keys():
    if "040_ALY_040_HROTERRORBLADE_prev" in key:  # Search for the filename with substring in Version Stack
        print('Found the Version Stack Name: ', key)
        version_stack_upl_id = all_version_stacks.get(key)
        print('Version Stack ID:             ', version_stack_upl_id)
        key_found = True
if not key_found:
    print("Version Stack not found")
0 голосов
/ 25 марта 2020

Эта функция либо возвращает список со всеми ключами, которые соответствуют подстроке, либо возвращает false, если совпадений нет.

def get_keys(d, sub):
    keys = []
    for k in d.keys():  # For each key
        if sub in k:  # Check if it matches the sub-string
            keys.append(k)  # Save key if it does
    if len(keys) == 0:
        return False  # If no matches are found return False
    return keys  # Else return the list of keys


d = {"firtsKey" : 1, "secondKey" : 2, "otherItem": 3}
test1 = get_keys(d, "Key")
test2 = get_keys(d, "notinkey")
print(test1)  # Outputs: ['firtsKey', 'secondKey']
print(test2)  # Outputs: False

Возможный способ сделать это в одной строке:

d = {"firtsKey" : 1, "secondKey" : 2, "otherItem": 3}
sub = "Key"
f = filter(lambda x: sub in x, list(d.keys()))
# Then use the results
for i in f:
   print(i) 
# Output:
# firtsKey
# secondKey
...