这是我的代码:它在一个字典中查找,在另一个字典中查找并计算第一个字典的值的分数。
d_score = {k: [0, 0, 0] for k in d_filtered_words.keys()}
for k, v in d_filtered_words.items():
for word in v:
if word in dico_lexique:
print(word, dico_lexique[word]
d_score[k] = [a + b for a, b in zip(map(int, dico_lexique[word]), d_score[k])]
d_score = {k: list(map(str, v)) for k, v in d_score.items()}
打印结果为:
avoir ['101', '3772', '110']
serrer ['175', '936', '252']
main ['251', '2166', '49']
avoir ['101', '3772', '110']
serrer ['175', '936', '252']
enfant ['928', '1274', '19']
aérien ['354', '769', '39']
affable ['486', '45', '32']
affaire ['46', '496', '104']
agent ['265', '510', '18']
connaître ['448', '293', '29']
rien ['24', '185', '818']
trouver ['387', '198', '31']
être ['225', '328', '44']
emmerder ['0', '23', '493']
rien ['24', '185', '818']
suffire ['420', '35', '56']
mettre ['86', '1299', '67']
multiprise ['314', '71', '0']
abasourdir ['0', '43', '393']
ablation ['75', '99', '353']
abominable ['0', '24', '1170']
être ['225', '328', '44']
seul ['65', '97', '540']
ami ['492', '72', '31']
aimer ['1140', '49', '35']
只需澄清一下: dico_lexique还包含key_word,如:
sabot de Vénus>orchidée;294;76;0
imbuvable>boisson;0;0;509
imbuvable>insupportable;0;0;416
accentuer>intensifier;255;89;4
accentuer>mettre un accent;50;29;30
这些是我在查看dico_lexique中的键时还要考虑的词
d_score的结果是:
{'15': ['1731', '12856', '792'], '44': ['3079', '4437', '2549'], '45': ['75', '166', '1916'], '47': ['7721', '3854', '7259']}
您好,只是为了澄清包含元素'>'的单词也是dico_lexique的一部分,它们不是来自另一个文件。在dico_lexique中,您对一个单词有不同的感觉,并为了区分它,在其后加上“>”。我只在dico_lexique和d_filtered中查找,并且要考虑key_word后跟'>',以便当我在d_filtered_words中看到'serrer'时,代码将检索'serrer'的值以及所有值“ serrer”一词后跟“>”。
d_score = {k: [0, 0, 0] for k in d_filtered_words.keys()}
for k, v in d_filtered_words.items():
for word in v:
regex =????
if word in dico_lexique and if word = re.findall(regex, word)
答案 0 :(得分:0)
编辑:更新问题后,将使用新版本。
样品数据现在为:
>>> d_filtered_words = {
... '1': ['avoir', 'main'],
... '2': ['main', 'serrer', 'posséder'],
... }
>>> dico_lexique = {
... 'avoir': ('101', '3772', '110'),
... 'avoir>posséder': ('91', '2724', '108'),
... 'serrer': ('175', '936', '252'),
... 'main': ('251', '2166', '49'),
... }
您必须先处理dico_lexique
才能删除>
之后的部分,并按主要词将值分组:
>>> values_by_word = {}
>>> for word, values in dico_lexique.items():
... main, *_ = word.split(">")
... values_by_word.setdefault(main, []).append(values)
>>> values_by_word
{'avoir': [('101', '3772', '110'), ('91', '2724', '108')], 'serrer': [('175', '936', '252')], 'main': [('251', '2166', '49')]}
说明:
main, *_ = word.split(">")
将所有内容保留在可选的>
之前,而忽略其余内容(请参见destructuring assignement)setdefault
创建一个与主词关联的新列表(如果主词不存在)并添加值。现在,与以下逻辑相同:
>>> def merge_values(tuples):
... """Sums columns (with a str->int->str conversion)"""
... return tuple(str(sum(int(v) for v in vs)) for vs in zip(*tuples))
>>> merged_values_by_word = {code:merge_values(tuples) for code, tuples in values_by_word.items()}
>>> merged_values_by_word
{'avoir': ('192', '6496', '218'), 'serrer': ('175', '936', '252'), 'main': ('251', '2166', '49')}
(我将get_values
重命名为merge_values
,但功能相同。)
您可以将下面的代码与merged_values_by_word
而非dico_lexique
一起使用。
编辑结束:下面的旧版本作为记录
您混合了两个问题:代码的功能(与单词或单词系列相关的值求和)和解析文件或字符串。
让我总结一下:
*您有dico_lexique
可以将一个单词映射到三个值(包含整数的字符串)
*您有d_filtered_words
可以将代码(“ 15”,“ 44”,...)映射到单词列表。
*您创建了一个字典,将每个映射到代码并在[sum of the value1, sum of the value2, sum of the value2]
中出现的单词的代码映射到dico_lexique
。
首先,如果您始终有三个值,请使用tuple
,而不要使用list
。我将使用此自定义示例:
>>> d_filtered_words = {
... '1': ['avoir', 'main'],
... '2': ['main', 'serrer', 'posséder'],
... }
>>> dico_lexique = {
... 'avoir': ('101', '3772', '110'),
... 'serrer': ('175', '936', '252'),
... 'main': ('251', '2166', '49'),
... # no posséder here
... }
第二,构建一个将代码映射到三个值列表的字典:
>>> def get_tuples(words):
... """return the tuples of values for every word in dico_lexique"""
... return [dico_lexique[word] for word in words if word in dico_lexique]
>>> tuples_by_code = {code:get_tuples(words) for code, words in d_filtered_words.items()}
>>> tuples_by_code
{'1': [('101', '3772', '110'), ('251', '2166', '49')], '2': [('251', '2166', '49'), ('175', '936', '252')]}
第三,将值“按列”求和。有一个简单的方法可以做到:
>>> tuples = [(1,2,3), (4,5,6)]
>>> tuple(zip(*tuples))
((1, 4), (2, 5), (3, 6))
>>> tuple(map(sum, zip(*tuples)))
(5, 7, 9)
zip
函数将每个元组的第一个元素分组,然后将每个元组的第二个元素分组,然后...:您得到“列”,而只需要对它们进行求和。就您而言:
>>> def get_values(tuples):
... """Sums columns (with a str->int->str conversion)"""
... return tuple(str(sum(int(v) for v in vs)) for vs in zip(*tuples))
>>> values_by_code = {code:get_values(tuples) for code, tuples in tuples_by_code.items()}
>>> values_by_code
{'1': ('352', '5938', '159'), '2': ('426', '3102', '301')}
现在您的问题。想象一下,我有一个具有其他形式的文本文件:
>>> text = """avoir>posséder
... voilé>dissimulé
... voilé>caché"""
您必须解析该文件,并分割>
上的每一行以构建字典alternative -> main
:
>>> main_by_alternative = {a: m for line in text.split("\\n") for m, a in [line.split(">")]}
>>> main_by_alternative
{'posséder': 'avoir', 'dissimulé': 'voilé', 'caché': 'voilé'}
关键思想是在char >
上拆分行,以在列表中获取主要形式和替代形式。 for m, a in [line.split(">")]
是让m, a = line.split(">")
接受dict的技巧。现在,回到get_tuples
:
>>> def get_tuples(words):
... """return the tuples of values for every word in dico_lexique"""
... return [dico_lexique[main_by_alternative.get(word, word)] for word in words if main_by_alternative.get(word, word) in dico_lexique]
有什么新变化?查看:main_by_alternative.get(word, word)
。如果退出,它只会得到主要形式,否则便是单词本身。
>>> {code:get_tuples(words) for code, words in d_filtered_words.items()}
{'1': [('101', '3772', '110'), ('251', '2166', '49')], '2': [('251', '2166', '49'), ('175', '936', '252'), ('101', '3772', '110')]}
代码2
现在映射到三个词:“ main”,“ serrer”,“ avoir”(通过“posséder”)。
希望有帮助。我使用了很多dict / list理解来简化它,但如果需要,请不要犹豫,将代码扩展为常规循环。