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

2024-09-30 08:32:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个字符串,它包含(独占)几个子字符串中的一个。我想检查包含哪个子字符串,并获取与之关联的值。这就是为什么我要用字典做这个操作

例如:

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

在这种情况下,应返回0

背景是我有一个pandas数据帧(df),其列string_to_check充满了这些字符串。根据每行中包含的子字符串,我想为dataframe的新列的相应行分配一个值

示例结果:

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

结合应用。但是现在我觉得自己把这些碎片拼在一起太愚蠢了

编辑:

好吧,我想我自己解决了这个问题:

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风格的方法的建议


Tags: to字符串indfforstringdefcheck
3条回答

只有很少的建议

首先,您可以在代码中用dict类substrings.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])

对于第一个问题,使用^{}迭代从^{}获得的键、值对,并检查键是否为indict:

>>> 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]

但是对于您的实际问题,您可以使用^{}将带有|字符的^{}substrings中的^{}连接到^{},然后^{}将结果连接到substrings

>>> 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
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

相关问题 更多 >

    热门问题