Python - 如果字符串包含键,则获取字典值

4
我有一个字符串,其中仅包含若干子字符串之一。我想检查它包含哪个子字符串并获取与之相关联的值。这就是为什么我会使用字典进行此操作。
例如:
string_to_check = 'TEST13-872B-A22E'
substrings = {'TEST': 0, 'WORLD': 1, 'CORONA':2}

在这种情况下,应该返回0。
背景是我有一个带有string_to_check列的pandas DataFrame(df),该列包含这些字符串。根据每行包含的子字符串,我想要将一个值分配给数据框的新列的相应行。
示例结果:
string_to_check       result

'TEST13-872B-A22E'    0
'CORONA1-241-22E'     2
'TEST32-33A-442'      0
'WORLD4-BB2-A343'     1

我想我可以使用类似的东西

def check_string(string_to_check):
    for stri, val in zip(substrings.keys, substrings.values):
        if stri in string_to_check:
            return val

结合使用apply方法。但目前我感觉自己太笨了,无法自行拼凑。

编辑:

好的,我想我已经自己解决了这个问题:

def check_string(string_to_check):
    for stri, val in zip(substrings.keys(), substrings.values()):
        if stri in string_to_check:
            return val

df['result'] = df['string_to_check'].apply(check_string)

但我很乐意看到更短、更易读、更符合Python风格的方法建议。

3个回答

3

仅有少数建议

首先,在您的代码中,您可以使用字典类substrings.items()items方法来代替zip(substrings.keys(), substrings.values())

然后,如果您想要,在apply方法内部可以使用lambda函数。该lambda函数会生成所需的输出。

lambda x: [val for key, val in substrings.items() if key in x][0]

请注意,如果在 string_to_check 中没有任何子字符串出现,则由于使用了 [0],该函数会引发错误。

df['result'] = df['string_to_check'].apply(lambda x: [val for key, val in substrings.items() if key in x][0])

2

对于第一个问题,使用 字典推导式 遍历从 dict.items() 获得的键值对,并检查键是否在字典中:

>>> string_to_check = 'TEST13-872B-A22E'
>>> substrings = {'TEST': 0, 'WORLD': 1, 'CORONA':2}

>>> [val for key, val in substrings.items() if key in string_to_check]
 [0]

但是对于您的实际问题,您可以使用str.joindict.keys()|字符连接起来,以pandas.str.Series.extractsubstrings中提取dict.values(),然后将结果映射到substrings中,可以使用pandas.Series.map来完成:

>>> df
      string_to_check
0  'TEST13-872B-A22E'
1   'CORONA1-241-22E'
2    'TEST32-33A-442'
3   'WORLD4-BB2-A343'

>>> df.assign(result=
           df.string_to_check
             .str.extract(f"({'|'.join(substrings.keys())})", expand=False)
             .map(substrings))

      string_to_check  result
0  'TEST13-872B-A22E'       0
1   'CORONA1-241-22E'       2
2    'TEST32-33A-442'       0
3   'WORLD4-BB2-A343'       1

0
for i in strings_to_check:
    to_return = []
    for j in substrings.keys():
        if j in i:
            to_return.append(substring[j])
            break
        to_return.append(-1)
            
return to_return

所有目标字符串都将存储在strings_to_check中,返回值是这些字符串的所有输出的列表,如果找不到可行的输出,则附加-1。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接