Словарь списков из двух конкретных столбцов CSV-файла - PullRequest
0 голосов
/ 22 октября 2018

CSV-файлы, с которыми я имею дело, выглядят так:

{http://www.omg.org/XMI}id,begin,end,Emotion
17266,772,781,anticipation
17402,772,781,disgust
17304,1345,1370,disgust
17424,1534,1543,surprise
17424,1534,1543,surprise
17424,1534,1543,surprise
17424,1534,1543,surprise
17472,1578,1602,anger
17525,1611,1617,fear

Я пытаюсь создать словарь списков, содержащий в качестве ключей записи 'Emotion' и 'begin' (второй столбец) как значения ключей, которые встречаются в их ряду.

Желаемый вывод будет выглядеть так:

{'anger': [1578,
           2853,
           3951,...],
 'anticipation': [772, 4154, 4400...],
...}

Пока мне удалосьвыведите желаемый результат, но каждое значение представляет собой собственный список внутри списка каждой клавиши.

Мой текущий код:

import pickle
from pprint import pprint
import tkinter
from tkinter import filedialog
import csv
from itertools import groupby


root_tk = tkinter.Tk()
root_tk.wm_withdraw()

def extract_gold_emotions():


    """Returns mapping of GOLD emotions to their indices"""



    filename = filedialog.askopenfilename()


    l = list(csv.reader(open(filename)))


    f = lambda x: x[-1]


    gold_emo_offsets = {k:list(sorted(map(int, x[1:2])) for x in v)\
                           for k,v in groupby(sorted(l[1:], key=f), f)}


    pickle.dump(gold_emo_offsets, open("empos.p", "wb"))


    return gold_emo_offsets


my_emotions = extract_gold_emotions()

Текущий вывод:

{'anger': [[1578], [2853], [3951], [4084], [4693], [6420], [8050]],
 'anticipation': [[772], [4154], [4400], [7392]],....]]}

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

Заранее спасибо!

РЕДАКТИРОВАТЬ:

Значения словаря должны быть выведены как целых чисел .

Ответы [ 3 ]

0 голосов
/ 22 октября 2018

вы можете использовать collections.defaultdict для получения словаря результатов:

from io import StringIO
import csv
from collections import defaultdict

text = '''id,begin,end,Emotion
17266,772,781,anticipation
17402,772,781,disgust
17304,1345,1370,disgust
17424,1534,1543,surprise
17424,1534,1543,surprise
17424,1534,1543,surprise
17424,1534,1543,surprise
17472,1578,1602,anger
17525,1611,1617,fear'''

data = defaultdict(list)

with StringIO(text) as file:
    for row in csv.DictReader(file):
        data[row['Emotion']].append(row['begin'])

print(data)
0 голосов
/ 22 октября 2018

Использование только базового Python, без импорта (*):

Запись файла:

with open("data.csv","w") as w:
    w.write("""{http://www.omg.org/XMI}id,begin,end,Emotion
17266,772,781,anticipation
17402,772,781,disgust
17304,1345,1370,disgust
17424,1534,1543,surprise
17424,1534,1543,surprise
17424,1534,1543,surprise
17424,1534,1543,surprise
17472,1578,1602,anger
17525,1611,1617,fear
""")

Чтение и обработка файла:

d = {}
with open("data.csv","r") as r:
    next(r) # skip header
    for line in r:
        if line.strip(): # ignore empty lines (f.e. the last one)
            l = line.strip().split(",")
            begin = l[1] # the begin column
            emo = l[-1]  # the emotion column
            k = d.setdefault(emo,[]) # get/create key + empty list if needed
            k.append(begin)            # append to key as string
            # k.append(int(begin))     # append to key but convert to int first

print(d)            

Вывод (добавляется какstring):

{'anger': ['1578'], 
 'surprise': ['1534', '1534', '1534', '1534'], 
 'fear': ['1611'], 
 'anticipation': ['772'], 
 'disgust': ['772', '1345']}

(*): Вы не должны анализировать csv самостоятельно, если он содержит такие элементы, как экранированный текст или символы «в строке / экранированный» разделителя.Ваши данные обычные , и вы можете проанализировать их самостоятельно.

0 голосов
/ 22 октября 2018

Использование collections.defaultdict и csv.DictReader

Пример:

import csv
import collections

d = collections.defaultdict(list)

with open(filename) as infile:
    reader = csv.DictReader(infile)        
    for row in reader:
        d[row["Emotion"]].append(row["begin"])

print(d)

Выход:

defaultdict(<type 'list'>, {'anger': ['1578'], 'surprise': ['1534', '1534', '1534', '1534'], 'fear': ['1611'], 'anticipation': ['772'], 'disgust': ['772', '1345']})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...