Tengo muchos archivos con datos organizados así:

20190920;100000;MGNT;3616
20190920;100000;RSTI;10128
20190920;100001;SIBN;4150.5
20190920;100001;SNGSP;3771.5
20190920;100002;MGNT;3617
20190920;100002;TATN;2966.8
20190920;100003;SNGSP;15086
20190920;100004;TATNP;1359.6
20190920;100005;SNGSP;75410
20190920;100005;AFLT;133672.4
20190920;100005;SNGSP;3771.5

Quiero leerlos y crear un diccionario. Tickers como MGNT, TATN son sus claves. Sus valores son diccionarios como

{20190920 : value}

Donde valor es la lista de dígitos:

[3616, 3617 .....] #they are the last digits in my data example. 

Entonces, esto es algo como

{'MGNT' : {20190920 : [3616, 3617, 3615]}}

Esto es lo que hago sin resultado

crude_base = {}
for item in datafiles: #loop throw files. 1 file contains data for 1 day
    # open file
    for line in file_object:    
        line = line.split(';')  
        date = line[0]
        time = line[1]
        ticker = line[2]
        price = line[3]
        #Now I want to append price in list inside crude_base[ticker][data] 

¿Cómo puedo agregar precio en la lista dentro del diccionario?

-1
Igor K. 28 sep. 2019 a las 23:26

3 respuestas

La mejor respuesta

Esto debería hacer lo que quiera, suponiendo que no le importe ahorrar tiempo.

crude_base = {}
for item in datafiles:
    # open file
    for line in file_object:
        line = line.split(';')
        date = line[0]
        time = line[1]
        ticker = line[2]
        price = line[3]
        if ticker not in crude_base:
            crude_base[ticker] = {}
        if date not in crude_base[ticker]:
            crude_base[ticker][date] = [price]
        else:
            crude_base[ticker][date].append(price)
3
Michael P. 29 sep. 2019 a las 00:29

Puede usar un defaultdict que creará un diccionario para usted sin tener que definir las claves.

Con esto, puede definir un diccionario anidado dentro de otro diccionario, con el valor de una lista. Cuando utiliza la referencia crude_base [ticker] [fecha], se crea automáticamente una lista vacía (o cualquier elemento que especifique, por ejemplo, podría especificar un conjunto o int, etc.).

El código entonces se vería así;

from collections import defaultdict


crude_base = defaultdict(lambda: defaultdict(list))

# 1. loop thought the files
for item in datafiles:

    # 2. open file
    for line in file_object: 

        # 3. Unpack into parts
        date, time, ticker, price = line.split(';')

        # 4. Append price in list inside crude_base[ticker][date]
        crude_base[ticker][date].append(price)

0
Maddo 28 sep. 2019 a las 21:29

Probablemente necesite verificar si existen las claves, algo como lo que sigue:

crude_base = {}
for item in datafiles: #loop throw files. 1 file contains data for 1 day
    # open file
    for line in file_object:    
        line = line.split(';')  
        date = line[0]
        time = line[1]
        ticker = line[2]
        price = line[3]
        if ticker not in crude_base:
            # Create the first level with a dictionary
            crude_base[ticker] = {date: [price]}
        else:
            # crude_base[ticker] exists and is a dictionary
            if date in crude_base[ticker]:
                # Date list already exists, just add the price to the list
                crude_base[ticker][date].append(price)
            else:
                # Create the dictionary entry for this date
                crude_base[ticker][date] = [price]
2
Romain Reboulleau 28 sep. 2019 a las 20:40
58150043