Python检查字符串是否包含字典的任何键

时间:2018-10-01 11:56:05

标签: python python-3.x

给出示例字典:

LANGUAGE_TO_ISO = {
    "en": "en",
    "eng": "en",
    "english": "en",
    "es": "es",
    "spanish": "es",
    ...
}

以及给定的示例字符串:

book_title = "The Dark Tower - english"
book_title = "The Dark Tower - eng"
book_title = "The Dark Tower 2 - english 2nd edition"

我不知道有没有Python函数可以搜索字符串是否包含任何字典键,然后返回相应的值,而不必在ISO字典中循环?

这样,我可以从多种语言编写方法中提取ISO语言。

如果有人知道这样做的肮脏方式,请分享:)

更新: 正如Willem所提到的,忘记指定用单词分隔“ english”,“ eng”,“ spanish”等。点,逗号,连字符,空格,...

4 个答案:

答案 0 :(得分:1)

我不知道这是否是最佳方法,但是我有一个循环,但是它非常紧凑:

def has_key_in(dictionary, string):
  return any(k in string for k in dictionary)

如果我没记错的话,好处是any会在遇到的第一个True条件下停止。

现在,问题在于您没有相应的值...

答案 1 :(得分:1)

这应该为您提供公用密钥:

set(book_title.split()).intersection(set(LANGUAGE_TO_ISO.keys()))

您可以查找字典以获取相应的值。


响应OP的评论,包括外壳上的输出片段:

In [4]: LANGUAGE_TO_ISO = { 
   ...:     "en": "en", 
   ...:     "eng": "en", 
   ...:     "english": "en", 
   ...:     "es": "es", 
   ...:     "spanish": "es", 
   ...: }                                                                                                                                                       

In [5]: book_title = "The Dark Tower - english"                                                                                                                 

In [6]: set(book_title.split()).intersection(set(LANGUAGE_TO_ISO.keys()))                                                                                       
Out[6]: {'english'}

答案 2 :(得分:1)

一种比较简单的方法是尝试使用正则表达式替换句子中的每个单词,然后尝试使用替换函数将单词替换为另一个单词,如果找不到,则默认为当前单词:

k_forfit = np.append(k, 1000)

a_forfit = np.append(a, 0)

weight = np.ones(len(k_forfit))

weight[0] = weight[-1] = 1000

a_coeff = np.polyfit(k_forfit, a_forfit, 2, w=weight)

plt.figure()
plt.plot(k, a)

plt.plot(k2 , a_coeff[0]*k2**2 + a_coeff[1]*k2 + a_coeff[2], 'g')

打印:

x = np.linspace(0, 903, 200)
y = -.005*(x-480)**2+1200

plt.figure()
plt.plot(x, y+(np.random.random(200)-.5)*100)
y2 = np.polyfit(x, y, 2)
plt.plot(np.arange(1000), y2[0]*np.arange(1000)**2 + y2[1]*np.arange(1000) +y2[2], 'g')
y2 = np.polyfit(x_forfit, y_forfit, 2, w=weight)
plt.plot(np.arange(1000), y2[0]*np.arange(1000)**2 + y2[1]*np.arange(1000) +y2[2], 'r')
plt.plot(1000, 0, 'bo')

答案 3 :(得分:0)

如果您仅对要处理的字符串的 words 感兴趣,我们可以对字典的 characters 数量进行线性匹配,方法是:

filter(None, map(LANGUAGE_TO_ISO.get, book_title.split()))

这将包含匹配的个单词的ISO代码列表(因此我们在单词'en'中不匹配'men' )。< / p>

例如:

>>> book_title = "The Dark Tower - eng"
>>> list(filter(None, map(LANGUAGE_TO_ISO.get, book_title.split())))
['en']

我们可以-如果需要-使其变得或多或少区分大小写(对于某些特殊情况,例如不带小写变体的字符,将不起作用):

filter(None, map(LANGUAGE_TO_ISO.get, book_title.lower().split()))

(鉴于字典中的键都是小写)。

但是,如果您希望能够解析 substrings (例如'en'中的'men'),那么您可能希望寻找一个 parser (解析器在输入中也是线性的,并且像带注释的有限状态机一样起作用)。

Python根据空格分割单词,但是点等不会分隔单词。但是,您可以使用正则表达式对它们进行拆分,例如:

import re

splt = re.compile('\W+')

filter(None, map(LANGUAGE_TO_ISO.get, splt.split(book_title)))

或根据您的修改:

  

点,逗号,连字符,空格,...

您可以在方括号之间列出字符:

import re

splt = re.compile('[\s.,-]+')

filter(None, map(LANGUAGE_TO_ISO.get, splt.split(book_title)))