![](/img/trans.png)
[英]Python: Check if a key in a dictionary is contained in a string in a list
[英]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.join
将dict.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.