给出示例字典:
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”等。点,逗号,连字符,空格,...
答案 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)))