TypeError: объект 'int' не может быть подписан - при попытке создать CSV-файлы - PullRequest
0 голосов
/ 18 сентября 2018

Мой словарь auto_anno выглядит следующим образом:

defaultdict(<class 'dict'>,
            {'Beda': {'Fuery': {'anger': 2,
                                'anticipation': 1,
                                'disgust': 2,
                                'fear': 2,
                                'sadness': 2}},
             'Fuery': {'Beda': {'surprise': 1},
                       'Fuery': {'anger': 1,
                                 'anticipation': 6,
                                 'disgust': 2,
                                 'fear': 1,
                                 'joy': 5,
                                 'sadness': 2,
                                 'surprise': 4,
                                 'trust': 4},
                       'Hawkeye': {'anger': 1, 'fear': 3, 'trust': 1},...#etc

Моя цель состоит в том, чтобы автоматически создавать два файла csv с использованием таких словарей.Один CSV-файл для узлов (идентификаторы персонажа от 0 до x и его метка, или имя персонажа) и второй CSV-файл для их отношений в зависимости от эмоции и ее веса (здесь: ключи первого слова - это source и ключи вложенного dict: target.

До сих пор я придумал эту функцию, которая использует pickle для загрузки словаря выше:

def automate_gephi():
    """CREATES TWO CSV FILES TO USE IN GEPHI"""
    auto_anno = pickle.load(open("auto_anno.p", "rb"))
    characters = set()
    for char1,value in auto_anno.items(): # this is the predicted graph (a dictionary where each key is an experiencer and each value is a stimulus with emotions)
        for char2,val in value.items():
            characters.add(char1)
            characters.add(char2)

    file_node = open("nodes.csv", "w") #only nodes and id's go here
    file_node.write("Id"+"\t"+"Label"+"\n")

    # for each node create a numeric id and write to file
    for n,name in enumerate(characters):
        file_node.write(str(n)+"\t"+"%s" %name+"\n")
    file_node.close()

    # edges
    read_nodes = open("nodes.csv","r")
    edges_file = open("edges.csv","w")
    sep = "\t"
    edges_file.write("Source"+sep+"Target"+sep+"Label"+sep+"Weight"+"\n")
    Adjacency = {}

    for line in read_nodes:
        try:
            Adjacency[line.strip().split("\t")[1]] = line.strip().split("\t")[0]
        except IndexError:
            pass
        continue

    for key,value in auto_anno.items():
        source = key
        for k1,v1 in value.items():
            target = k1
            for emotion,weight in v1.items():
                try:
                    edges_file.write(str(Adjacency[source])+sep+str\
                                     (Adjacency[target])+sep+emotion+sep+\
                                     " ".join([i for i in weight["Weight"]])+"\n")
                except KeyError:
                    pass
    edges_file.close()

НоЯ получаю это сообщение об ошибке:

line 224, in automate_gephi
    " ".join([i for i in weight["Weight"]])+"\n")

TypeError: 'int' object is not subscriptable

Пример желаемого вывода:

ФАЙЛ 1: Узлы :

Id  Label
0   Beda
1   Fuery
2   Hawkeye

ФАЙЛ 2: Края :

Source  Target  Label  Weight
0  1  anger  2
0  1  anticipation  1
.
.
.#etc

Что мне здесь не хватает? Любая помощь приветствуется!

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

1 Ответ

0 голосов
/ 18 сентября 2018

В этой строке

for emotion,weight in v1.items()

Вы устанавливаете emotion для клавиши и weight для значения.Позже вы попробуете это weight["Weight"], которое дает вам эту ошибку, так как weight - это просто число на данный момент.Вам нужно изменить понимание списка, с которым я / мы можем помочь, но я не уверен, что именно вы пытаетесь с ним делать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...