如果在子列表列表中找到键,如何总结不同键的值?
How to sum up values of different keys if the key is find in a list of sublists?
首先英语不是我的母语。
我有这样的 txt 文件:它是一个带有数字分数的单词列表:
id;word;pos;neu;neg
0;***;21;127;0
1;vraiment;407;156;37
2;oiseau-à-berceau;102;259;0
3;Stoph;95;308;37
4;Conscience;372;144;35
5;rançonnement;0;635;433
6;provenir;304;227;47
7;esthétique;285;54;1
8;traversée;360;167;38
9;avant toute chose;241;108;34
10;sucrée;52;276;0
11;Lasker-Schüler;146;284;0
12;difficile;0;47;866
13;adjuration;300;44;40
14;Besnier-Boeck-Schaumann;0;39;315
15;sir Sacheverell Sitwell;38;277;0
16;Maria Callas;235;311;0
17;sorbre;118;302;225
我有一个这样的子列表列表,其中每个列表都包含一些单词:
[['trouver', 'très', 'esthétique'], ['pêche', 'peu'], ['gros', 'prise', 'là'], ['prise', 'puis', 'borne', 'cela', 'voir'], ['derrière', 'télé', 'cela', 'aller'], ['voir', 'système', 'cela', 'aller', 'être', 'difficile', 'faire', 'plus', 'sorbre'], ['laudrel', 'être', 'mourir', 'hier', 'soir'], ['venir', 'lo']]
我将 txt 文件存储在我的脚本中的词典中:看起来像这样:
{'vraiment': ['407', '156', '37\r\n'], 'oiseau-à-berceau': ['102', '259', '0\r\n'], 'Stoph': ['95', '308', '37\r\n'], 'Conscience': ['372', '144', '35\r\n'], 'rançonnement': ['0', '635', '433\r\n'], 'provenir': ['304', '227', '47\r\n'], 'esthétique': ['285', '54', '1\r\n'], 'traversée': ['360', '167', '38\r\n'], 'avant toute chose': ['241', '108', '34\r\n'], 'sucrée': ['52', '276', '0\r\n'], 'Lasker-Schüler': ['146', '284', '0\r\n'], 'difficile': ['0', '47', '866\r\n'], 'adjuration': ['300', '44', '40\r\n'], 'Besnier-Boeck-Schaumann': ['0', '39', '315\r\n'], 'sir Sacheverell Sitwell': ['38', '277', '0\r\n'], 'Maria Callas': ['235', '311', '0\r\n'], 'sorbre': ['118', '302', '225']}
对于我列表中的每个子列表,我检查它的任何单词是否是我的字典,如果它在我的字典中的子列表中找到一个单词,它会检索我列表中每个单词的数值并对值求和每列的每个单词。
例如:
[ 'voir', 'système', 'aller', 'être', 'difficile', 'faire', 'plus',
'sorbre'] : 'difficile' ['0', '47', '866\r\n']
'sorbre': ['118', '302', '225']
上面的这个子列表在我的字典中有两个单词,我想将我的子列表中所有单词的每个索引加在一起,并对我列表中的每个子列表进行计算;
我希望我的子列表的每个列表都得到第一个索引中的分数总和(0),然后是第二个索引中的分数总和(1)以及第一个索引中的分数总和第三个索引 (2) 用于我的 dico 和我的子列表中存在的所有单词:
[ 'voir', 'système', 'aller', 'être', 'difficile', 'faire', 'plus',
'sorbre'] : pos : 118, neu : 349, neg 1091
这是我的脚本:
from itertools import islice
dico = {}
#lexique = open('lexique.txt', 'rb')JeuxdeMotsPolarise.txt'
with codecs.open('lexique_entrainement.txt', 'r', 'utf-8', errors = 'ignore') as lexique:
for ligne in islice(lexique, 31, None):
#print(ligne)
ligne = ligne.split(';')
#print(ligne)
#print(ligne[-4:])
dico.update({ligne[-4]:ligne[-3:]})
print(dico)
somme_V0 = []
somme_V1 = []
somme_V2 = []
for k, v in dico.items():
for subl in Lemme_filtre2:
for w in subl:
if k == w:
somme_V0.append(int(v[0]))
somme_V1.append(int(v[1]))
somme_V2.append(int(v[2]))
#print(subl)
print(str(subl) + " : " + " a un score pos de: " + str(sum(somme_V0)) + " un score de neu de : " + str(sum(somme_V1)) + " et un score de neg de : " + str(sum(somme_V2)))118 349 1091
输出是这样的:
['trouver', 'très', 'esthétique'] : a un score pos de: 285 un score de neu de : 54 et un score de neg de : 1
['voir', 'système', 'cela', 'aller', 'être', 'difficile', 'faire', 'plus', 'sorbre'] : a un score pos de: 285 un score de neu de : 101 et un score de neg de : 867
['voir', 'système', 'cela', 'aller', 'être','difficile', 'faire','plus', 'sorbre'] : a un score pos de: 403 un score de neu de : 403 et un score de neg de : 1092
输出与我想象的不一样,我认为它是对所有子列表中单词的所有值的总和,你知道我该如何解决它,我应该是这样的:
['trouver', 'très', 'esthétique'] : a un score pos de: 285 un score de neu de : 54 et un score de neg de : 1
['voir', 'système', 'cela', 'aller', 'être', 'difficile', 'faire', 'plus', 'sorbre'] : a un score pos de: 118 un score de neu de : 349 et un score de neg de : 1091
我也想如果每个子列表的第三个总和高于其他两个,我想单独显示列表和更高的分数。
希望这会有所帮助。
dico = {"a":["1","2","3"],"b":["2","2","3"],"c":["1","3","4"],"d":["1","3","5"]}
Lemme_filtre2 = [["a","b","l","p"],["l","f","l","p"],["a","g","d","p"],["p","c","o","p"]]
for subl in Lemme_filtre2:
somme_V0 = []
somme_V1 = []
somme_V2 = []
for w in subl:
if w in dico:
somme_V0.append(int(dico[w][0]))
somme_V1.append(int(dico[w][1]))
somme_V2.append(int(dico[w][2]))
if len(somme_V0)!=0:
print(str(subl) + " : " + " a un score pos de: " + str(sum(somme_V0)) + " un score de neu de : " + str(sum(somme_V1)) + " et un score de neg de : " + str(sum(somme_V2)))
输出
['a', 'b', 'l', 'p'] : a un score pos de: 3 un score de neu de : 4 et un score de neg de : 6
['a', 'g', 'd', 'p'] : a un score pos de: 2 un score de neu de : 5 et un score de neg de : 8
['p', 'c', 'o', 'p'] : a un score pos de: 1 un score de neu de : 3 et un score de neg de : 4
这是您的最终代码:
# Consider below as your input text
text_file = """
id;word;pos;neu;neg
0;***;21;127;0
1;vraiment;407;156;37
2;oiseau-à-berceau;102;259;0
3;Stoph;95;308;37
4;Conscience;372;144;35
5;rançonnement;0;635;433
6;provenir;304;227;47
7;esthétique;285;54;1
8;traversée;360;167;38
9;avant toute chose;241;108;34
10;sucrée;52;276;0
11;Lasker-Schüler;146;284;0
12;difficile;0;47;866
13;adjuration;300;44;40
14;Besnier-Boeck-Schaumann;0;39;315
15;sir Sacheverell Sitwell;38;277;0
16;Maria Callas;235;311;0
17;sorbre;118;302;225
"""
lst = [['trouver', 'très', 'esthétique'], ['pêche', 'peu'], ['gros', 'prise', 'là'], ['prise', 'puis', 'borne', 'cela', 'voir'], ['derrière', 'télé', 'cela', 'aller'], ['voir', 'système', 'cela', 'aller', 'être', 'difficile', 'faire', 'plus', 'sorbre'], ['laudrel', 'être', 'mourir', 'hier', 'soir'], ['venir', 'lo']]
foo = ({i.split(";")[1]:i.split(";")[2:] for i in text_file.split("\n") if i}) # Spliting the text content and creating a dictionary
z = {}
for i in lst: # Loop through the lst
for j in i: # Loop through the element in inner list
if j in foo: # check if inner value is in dict foo
# Here we are creating our final result dictionary
if z.get(repr(i)): # check if the key i already exists in dictionary z, if yes then we will add the values of the dictionary. repr is used to use list as a key of dictionary.
t = [int(a) + int(b) for a,b in zip(z[repr(i)] ,foo[j])] # zip takes one element at a time of of both list. we are adding it and storing it in a list
z[repr(i)] = t # Adding the list t to dict z
else:
z[repr(i)] = foo[j] # If the value is not existing in dict z then we just keep the output of foo
print (z) # Printing our final dictonary
# Below I have looped through the result to print it as required
for k, v in z.items():
print (f"{k}: a un score pos de: {v[0]} un score de neu de : {v[1]} et un score de neg de : {v[2]}") # Printing our dict one by one
结果
# Dict output
{"['trouver', 'très', 'esthétique']": ['285', '54', '1'], "['voir', 'système', 'cela', 'aller', 'être', 'difficile', 'faire', 'plus', 'sorbre']": [
118, 349, 1091]}
# Final output
['trouver', 'très', 'esthétique']: a un score pos de: 285 un score de neu de : 54 et un score de neg de : 1
['voir', 'système', 'cela', 'aller', 'être', 'difficile', 'faire', 'plus', 'sorbre']: a un score pos de: 118 un score de neu de : 349 et un score de neg de : 1091
首先英语不是我的母语。
我有这样的 txt 文件:它是一个带有数字分数的单词列表:
id;word;pos;neu;neg
0;***;21;127;0
1;vraiment;407;156;37
2;oiseau-à-berceau;102;259;0
3;Stoph;95;308;37
4;Conscience;372;144;35
5;rançonnement;0;635;433
6;provenir;304;227;47
7;esthétique;285;54;1
8;traversée;360;167;38
9;avant toute chose;241;108;34
10;sucrée;52;276;0
11;Lasker-Schüler;146;284;0
12;difficile;0;47;866
13;adjuration;300;44;40
14;Besnier-Boeck-Schaumann;0;39;315
15;sir Sacheverell Sitwell;38;277;0
16;Maria Callas;235;311;0
17;sorbre;118;302;225
我有一个这样的子列表列表,其中每个列表都包含一些单词:
[['trouver', 'très', 'esthétique'], ['pêche', 'peu'], ['gros', 'prise', 'là'], ['prise', 'puis', 'borne', 'cela', 'voir'], ['derrière', 'télé', 'cela', 'aller'], ['voir', 'système', 'cela', 'aller', 'être', 'difficile', 'faire', 'plus', 'sorbre'], ['laudrel', 'être', 'mourir', 'hier', 'soir'], ['venir', 'lo']]
我将 txt 文件存储在我的脚本中的词典中:看起来像这样:
{'vraiment': ['407', '156', '37\r\n'], 'oiseau-à-berceau': ['102', '259', '0\r\n'], 'Stoph': ['95', '308', '37\r\n'], 'Conscience': ['372', '144', '35\r\n'], 'rançonnement': ['0', '635', '433\r\n'], 'provenir': ['304', '227', '47\r\n'], 'esthétique': ['285', '54', '1\r\n'], 'traversée': ['360', '167', '38\r\n'], 'avant toute chose': ['241', '108', '34\r\n'], 'sucrée': ['52', '276', '0\r\n'], 'Lasker-Schüler': ['146', '284', '0\r\n'], 'difficile': ['0', '47', '866\r\n'], 'adjuration': ['300', '44', '40\r\n'], 'Besnier-Boeck-Schaumann': ['0', '39', '315\r\n'], 'sir Sacheverell Sitwell': ['38', '277', '0\r\n'], 'Maria Callas': ['235', '311', '0\r\n'], 'sorbre': ['118', '302', '225']}
对于我列表中的每个子列表,我检查它的任何单词是否是我的字典,如果它在我的字典中的子列表中找到一个单词,它会检索我列表中每个单词的数值并对值求和每列的每个单词。
例如:
[ 'voir', 'système', 'aller', 'être', 'difficile', 'faire', 'plus',
'sorbre'] : 'difficile' ['0', '47', '866\r\n']
'sorbre': ['118', '302', '225']
上面的这个子列表在我的字典中有两个单词,我想将我的子列表中所有单词的每个索引加在一起,并对我列表中的每个子列表进行计算;
我希望我的子列表的每个列表都得到第一个索引中的分数总和(0),然后是第二个索引中的分数总和(1)以及第一个索引中的分数总和第三个索引 (2) 用于我的 dico 和我的子列表中存在的所有单词:
[ 'voir', 'système', 'aller', 'être', 'difficile', 'faire', 'plus',
'sorbre'] : pos : 118, neu : 349, neg 1091
这是我的脚本:
from itertools import islice
dico = {}
#lexique = open('lexique.txt', 'rb')JeuxdeMotsPolarise.txt'
with codecs.open('lexique_entrainement.txt', 'r', 'utf-8', errors = 'ignore') as lexique:
for ligne in islice(lexique, 31, None):
#print(ligne)
ligne = ligne.split(';')
#print(ligne)
#print(ligne[-4:])
dico.update({ligne[-4]:ligne[-3:]})
print(dico)
somme_V0 = []
somme_V1 = []
somme_V2 = []
for k, v in dico.items():
for subl in Lemme_filtre2:
for w in subl:
if k == w:
somme_V0.append(int(v[0]))
somme_V1.append(int(v[1]))
somme_V2.append(int(v[2]))
#print(subl)
print(str(subl) + " : " + " a un score pos de: " + str(sum(somme_V0)) + " un score de neu de : " + str(sum(somme_V1)) + " et un score de neg de : " + str(sum(somme_V2)))118 349 1091
输出是这样的:
['trouver', 'très', 'esthétique'] : a un score pos de: 285 un score de neu de : 54 et un score de neg de : 1
['voir', 'système', 'cela', 'aller', 'être', 'difficile', 'faire', 'plus', 'sorbre'] : a un score pos de: 285 un score de neu de : 101 et un score de neg de : 867
['voir', 'système', 'cela', 'aller', 'être','difficile', 'faire','plus', 'sorbre'] : a un score pos de: 403 un score de neu de : 403 et un score de neg de : 1092
输出与我想象的不一样,我认为它是对所有子列表中单词的所有值的总和,你知道我该如何解决它,我应该是这样的:
['trouver', 'très', 'esthétique'] : a un score pos de: 285 un score de neu de : 54 et un score de neg de : 1
['voir', 'système', 'cela', 'aller', 'être', 'difficile', 'faire', 'plus', 'sorbre'] : a un score pos de: 118 un score de neu de : 349 et un score de neg de : 1091
我也想如果每个子列表的第三个总和高于其他两个,我想单独显示列表和更高的分数。
希望这会有所帮助。
dico = {"a":["1","2","3"],"b":["2","2","3"],"c":["1","3","4"],"d":["1","3","5"]}
Lemme_filtre2 = [["a","b","l","p"],["l","f","l","p"],["a","g","d","p"],["p","c","o","p"]]
for subl in Lemme_filtre2:
somme_V0 = []
somme_V1 = []
somme_V2 = []
for w in subl:
if w in dico:
somme_V0.append(int(dico[w][0]))
somme_V1.append(int(dico[w][1]))
somme_V2.append(int(dico[w][2]))
if len(somme_V0)!=0:
print(str(subl) + " : " + " a un score pos de: " + str(sum(somme_V0)) + " un score de neu de : " + str(sum(somme_V1)) + " et un score de neg de : " + str(sum(somme_V2)))
输出
['a', 'b', 'l', 'p'] : a un score pos de: 3 un score de neu de : 4 et un score de neg de : 6
['a', 'g', 'd', 'p'] : a un score pos de: 2 un score de neu de : 5 et un score de neg de : 8
['p', 'c', 'o', 'p'] : a un score pos de: 1 un score de neu de : 3 et un score de neg de : 4
这是您的最终代码:
# Consider below as your input text
text_file = """
id;word;pos;neu;neg
0;***;21;127;0
1;vraiment;407;156;37
2;oiseau-à-berceau;102;259;0
3;Stoph;95;308;37
4;Conscience;372;144;35
5;rançonnement;0;635;433
6;provenir;304;227;47
7;esthétique;285;54;1
8;traversée;360;167;38
9;avant toute chose;241;108;34
10;sucrée;52;276;0
11;Lasker-Schüler;146;284;0
12;difficile;0;47;866
13;adjuration;300;44;40
14;Besnier-Boeck-Schaumann;0;39;315
15;sir Sacheverell Sitwell;38;277;0
16;Maria Callas;235;311;0
17;sorbre;118;302;225
"""
lst = [['trouver', 'très', 'esthétique'], ['pêche', 'peu'], ['gros', 'prise', 'là'], ['prise', 'puis', 'borne', 'cela', 'voir'], ['derrière', 'télé', 'cela', 'aller'], ['voir', 'système', 'cela', 'aller', 'être', 'difficile', 'faire', 'plus', 'sorbre'], ['laudrel', 'être', 'mourir', 'hier', 'soir'], ['venir', 'lo']]
foo = ({i.split(";")[1]:i.split(";")[2:] for i in text_file.split("\n") if i}) # Spliting the text content and creating a dictionary
z = {}
for i in lst: # Loop through the lst
for j in i: # Loop through the element in inner list
if j in foo: # check if inner value is in dict foo
# Here we are creating our final result dictionary
if z.get(repr(i)): # check if the key i already exists in dictionary z, if yes then we will add the values of the dictionary. repr is used to use list as a key of dictionary.
t = [int(a) + int(b) for a,b in zip(z[repr(i)] ,foo[j])] # zip takes one element at a time of of both list. we are adding it and storing it in a list
z[repr(i)] = t # Adding the list t to dict z
else:
z[repr(i)] = foo[j] # If the value is not existing in dict z then we just keep the output of foo
print (z) # Printing our final dictonary
# Below I have looped through the result to print it as required
for k, v in z.items():
print (f"{k}: a un score pos de: {v[0]} un score de neu de : {v[1]} et un score de neg de : {v[2]}") # Printing our dict one by one
结果
# Dict output
{"['trouver', 'très', 'esthétique']": ['285', '54', '1'], "['voir', 'système', 'cela', 'aller', 'être', 'difficile', 'faire', 'plus', 'sorbre']": [
118, 349, 1091]}
# Final output
['trouver', 'très', 'esthétique']: a un score pos de: 285 un score de neu de : 54 et un score de neg de : 1
['voir', 'système', 'cela', 'aller', 'être', 'difficile', 'faire', 'plus', 'sorbre']: a un score pos de: 118 un score de neu de : 349 et un score de neg de : 1091