繁体   English   中英

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

[英]Python - Get dictionary value if key is contained in a string

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

例子:

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

在这种情况下,应返回 0。

背景是我有一个 pandas DataFrame ( df ) 的列string_to_check充满了这些字符串。 基于每行中包含 substring,我想为 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)

但我很高兴看到更多关于更短/更易读/更 pythonic 的方法的建议。

只有很少的建议

首先,在您的代码中,您可以将zip(substrings.keys(), substrings.values())替换为 dict class substrings.items()items方法。

然后,如果你愿意,你可以在apply方法中输入lambda function 这 lambda function 产生所需的 output

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

请注意,如果 string_to_check 中不存在string_to_check ,则 function 会因[0]而引发错误。

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

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

>>> 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.extract the dict.values dict.values() from substrings ,然后pandas.Series.map结果到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中,返回值是这些字符串所有输出的列表,如果没有找到可行的 output 附加字符串 -1。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM