LOOP в двух словарях, чтобы создать новый словарь в Python - PullRequest
2 голосов
/ 29 апреля 2019

У меня есть два словаря.Первый выглядит следующим образом:

{'15': ['monter', 'boulangerie'], '44': ['être', 'méchant'], '45': ['haïr', 'Foret', 'enchanter', 'être', 'beau', 'mille', 'faux', 'jeune', 'fille', 'être', 'asseoir', 'bor', 'mer'], '47': ['comprendre', 'vie', 'perdre', 'aide', 'stp', 'maman', 'perdre', 'être', 'seul', 'ami', 'aimer']}

Второй - это словарь, содержащий слова в качестве ключа и оценки в виде значений:

values = Positive_score, Neutral_score, Negative_Score

{"beau": ['1', '3', '2'], 'seul': ['0', '1', '2'], 'cité des loups': ['230', '63', '48'], 'pavage mosaïque': ['296', '108', '0'], "répression de toute forme d'opposition": ['0', '3', '2'], 'en prendre pour': ['0', '81', '260'], 'Walt Disney Records': ['2', '3', '1'], 'paraombilical': ['3', '1', '2'], 'Eugênio': ['32', '85', '0'], 'laissant': ['0', '1', '1'], 'Baudouin de Champagne': ['2', '4', '2'], 'loi Goblet': ['3', '2', '1'], 'jeune': ['290', '49', '81'], 'Guezer': ['91', '44', '29'], "aimer": ['134', '48', '0'], 'marque de produit de luxe': ['21', '28', '2'], 'Zostérops de Woodford': ['18', '38', '0'], 'Henry Ludwell Moore': ['3', '7', '0'], 'Charlyne>prénom': ['23', '28', '0'], 'famille Masreliez': ['5', '4', '2'], 'canadienne-américaine': ['10', '3', '0'], 'bédéguar': ['63', '292', '0'], 'prix Lalande': ['2', '3', '1'], 'rapiécetais': ['2', '2', '0'], 'Maysoon': ['0', '30', '0'], 'hospice civil': ['265', '51', '50'], 'soutirer à': ['0', '6', '11'], 'faux': ['18', '21', '0'], "l'homme amphibie": ['2', '2', '1'], 'Johnny Ryan': ['5', '2', '0'], 'marcher des épaules': ['83', '85', '60'], 'faire lit à part': ['5', '5', '2'], 'Fonteny': ['4', '3', '0'], 'effet boomerang': ['96', '92', '70'], 'Guy Tirolien': ['0', '3', '0'], 'Mans-Les': ['5', '2', '0'], 'Stuart Jacques Ier': ['19', '331', '0'], 'Jupiter II': ['26', '33', '18'], 'Reuth bei Erbendorf': ['0', '10', '2'], 'couronne perlée du gland': ['1', '3', '3'], 'Wikipédia en Arabe bédouin': ['1', '2', '1'], 'Karen Karapetian': ['3', '3', '0'], 'trois mille cinq cents': ['307', '93', '0'], 'charge familiale': ['200', '68', '78'], 'Neuville-Saint-Rémy': ['0', '19', '0'], 'méchant': ['0', '25', '79'], 'modèle de simulation numérique': ['187', '111', '45'], 'Akrotiri': ['0', '313', '23']}

Из этих двух словарей я хочу создать третийтот, который будет содержать ключ первого словаря и значения будут суммой положительного, нейтрального и отрицательного балла для всех слов в списке слов, поэтому у меня будет что-то вроде этого:

Я держу ключчтобы запомнить, к чему относится счет, если он не нашел ни одного слова, я все равно добавил бы ключ в словарь, но со значениями 000:

Ожидаемые результаты

{'15'; ['0', '0' , '0'], ['44': ['0', '25', '79'], '45': ['309','73','83'], '47': ['0','1','2']}

Мой код ниже:

dico_phrases = {}
for k, v in d_filtered_words: # regarde la liste
    for j in v:  # regarde les élements de la liste intérieure
        triplet =  dico_lexique.get(j,-1)
        if triplet != -1:
        # Ici nous créons notre dictionnaire finale
            if dico_phrases.get(repr(v)): # regarde si la cléi existe dans le dictionnaire 
            #si oui nous ajoutons les valeurs du dictionnaire. 
            #repr est utilisépour utiliser la liste comme cléde dictionnaire
                t = [int(a) + int(b) for a,b in zip(dico_phrases[repr(v)] ,dico_lexique[j])]  # zip prend un élement à  un temps donnédans chaque 
                # Ajout élement et storage dans la liste 
                dico_phrases[repr(v)] = t #ajoute la liste au dictionnaire
            else:
                dico_phrases[repr(v)] = dico_lexique[j] # si la valeur n'existe pas , on garde juste le dico
                                                      # print le dico final

print(dico_phrases) 

Но результат не тот, который я ожидаю: ключи не соответствуют ни ключу оригинального словаря, ни оценкам, так как я проверяю его вручную, чтобы проверить, верна ли оценка.

{"'5'": [784, 222, 0], "'4'": ['381', '121', '0'], "'7'": ['378', '172', '0']}

Я также хочу записать значения в CSV-файл, как это, но с другими столбцами:

id;d_tag;d_lemma;Positive_score;Neutral_score;Negative_score
15;##;##;0;0;0
44;##;##;0;25;79
45;##;##;309;73;83
47;##;##;0;1;2

Мой код:

dicts = d_verbatim, d_tag, d_lemma, d_filtered_words, d_score

with open('my_data.csv', 'w') as ofile:
    writer = csv.writer(ofile, delimiter=';')
    writer.writerow(['id', 'd_verbatim', 'd_tag', 'd_lemma', 'd_filtered_words', 'Positive Score', 'Neutral Score', 'Negative Score'])
    for key in d_verbatim.keys():
        writer.writerow([key] + [d[key] for d in dicts])

Ответы [ 3 ]

2 голосов
/ 29 апреля 2019

Предполагая, что d1 и d2 являются вашими словарями, и что вы не возражаете против использования Pandas, вы можете решить проблему в несколько строк:

from pandas import DataFrame, Series
counts = DataFrame(d2).T.join(Series(d1).apply(Series)\
             .stack().reset_index().set_index(0), how='outer')\
             .fillna(0).astype(int).groupby('level_0').sum()
counts = counts.loc[counts.index > 0, [0, 1, 2]]
counts.index.name = 'id'
counts.columns = ('Positive_score', 'Neutral_score', 'Negative_score')
counts.to_csv("file.csv", sep=';')
2 голосов
/ 29 апреля 2019
import numpy as np
import pandas as pd

# i used these names for the dictionaries to not get confused
number_dict = {'15': ['monter', 'boulangerie'], ... }
score_dict = {"beau": ['1', '3', '2'], ... }

# initialise output
out_dict = {}    

for number_entry in number_dict:
    score_keys = number_dict.get(number_entry)

    # intialise scores
    temp_score = np.zeros((1,3))
    for score_key in score_keys:

        # if there is an entry for that word, add its scores to the temp scores
        if score_dict.get(score_key):
            temp_score += np.array(score_dict.get(score_key), dtype=np.int32)

    # assign temp scores to output dictionary
    out_dict[int(number_entry)] = [a for a in temp_score.ravel()]

# convert to dataframe, transpose and rename columns
df = pd.DataFrame(out_dict)
df = df.T
df.columns = ['Positive_score', 'Neutral_score', 'Negative_score']

filename = 'filename.csv'

# save to csv with ';' as separator
df.to_csv(filename, sep=';')
1 голос
/ 29 апреля 2019

Это должно работать:

    d1 = {'15': ['monter', 'boulangerie'], '44': ['être', 'méchant'], '45': ['haïr', 'Foret', 'enchanter', 'être', 'beau', 'mille', 'faux', 'jeune', 'fille', 'être', 'asseoir', 'bor', 'mer'], '47': ['comprendre', 'vie', 'perdre', 'aide', 'stp', 'maman', 'perdre', 'être', 'seul', 'ami', 'aimer']}
    d2 = {"beau": ['1', '3', '2'], 'seul': ['0', '1', '2'], 'cité des loups': ['230', '63', '48'], 'pavage mosaïque': ['296', '108', '0'], "répression de toute forme d'opposition": ['0', '3', '2'], 'en prendre pour': ['0', '81', '260'], 'Walt Disney Records': ['2', '3', '1'], 'paraombilical': ['3', '1', '2'], 'Eugênio': ['32', '85', '0'], 'laissant': ['0', '1', '1'], 'Baudouin de Champagne': ['2', '4', '2'], 'loi Goblet': ['3', '2', '1'], 'jeune': ['290', '49', '81'], 'Guezer': ['91', '44', '29'], "aimer": ['134', '48', '0'], 'marque de produit de luxe': ['21', '28', '2'], 'Zostérops de Woodford': ['18', '38', '0'], 'Henry Ludwell Moore': ['3', '7', '0'], 'Charlyne>prénom': ['23', '28', '0'], 'famille Masreliez': ['5', '4', '2'], 'canadienne-américaine': ['10', '3', '0'], 'bédéguar': ['63', '292', '0'], 'prix Lalande': ['2', '3', '1'], 'rapiécetais': ['2', '2', '0'], 'Maysoon': ['0', '30', '0'], 'hospice civil': ['265', '51', '50'], 'soutirer à': ['0', '6', '11'], 'faux': ['18', '21', '0'], "l'homme amphibie": ['2', '2', '1'], 'Johnny Ryan': ['5', '2', '0'], 'marcher des épaules': ['83', '85', '60'], 'faire lit à part': ['5', '5', '2'], 'Fonteny': ['4', '3', '0'], 'effet boomerang': ['96', '92', '70'], 'Guy Tirolien': ['0', '3', '0'], 'Mans-Les': ['5', '2', '0'], 'Stuart Jacques Ier': ['19', '331', '0'], 'Jupiter II': ['26', '33', '18'], 'Reuth bei Erbendorf': ['0', '10', '2'], 'couronne perlée du gland': ['1', '3', '3'], 'Wikipédia en Arabe bédouin': ['1', '2', '1'], 'Karen Karapetian': ['3', '3', '0'], 'trois mille cinq cents': ['307', '93', '0'], 'charge familiale': ['200', '68', '78'], 'Neuville-Saint-Rémy': ['0', '19', '0'], 'méchant': ['0', '25', '79'], 'modèle de simulation numérique': ['187', '111', '45'], 'Akrotiri': ['0', '313', '23']}

    d3 = {k: [0, 0, 0] for k in d1.keys()} 
    for k, v in d1.items():
        for word in v:
            if word in d2:
                d3[k] = [a + b for a, b in zip(map(int, d2[word]), d3[k])]
    d3 = {k: list(map(str, v)) for k, v in d3.items()} # we require strings

Для сохранения в формате csv:

    import csv
    with open('filename.csv', 'w') as csvfile:
    csvwriter = csv.writer(csvfile, delimiter=';',
                        quotechar="'", quoting=csv.QUOTE_MINIMAL)
    csvwriter.writerow(['id', 'Positive Score', 'Neutral Score', 'Negative Score'])
    for k, v in d3.items():
        csvwriter.writerow([k] + v)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...