1

Hi I'm trying to become a better programmer with short and clean code. I'm trying to loop through a list in a list and change it to dictionary inside a list here is my code right now please show me if there is anyway to achieve is with shorter lines of code.

1st I need to loop through the list to change the miliseconds to date and then I need to loop through and add keys to the list so that I know what each value is.

import datetime

formatter = ['Date', 'Open', 'Close', 'High', 'Low', 'Volume']
list = [[1364770800000, 93.2, 93.033, 93.29, 92.9, 116.0018], [1364774400000, 93.25, 93.1, 100, 93.03, 345.58388931]]

print(list)

def mili_to_date(d):
    d /= 1000.0
    return datetime.date.fromtimestamp(d).strftime('%Y-%m-%d')


for i, row in enumerate(list):
    for index, column in enumerate(row):
        if index == 0:
            list[i][0] = mili_to_date(column)
        else:
            pass

for i, row in enumerate(list):
    list[i] = {}
    for index, column in enumerate(row):
        list[i][candles_formatter[index]] = column

print(list)
0

1 Answer 1

2

To be(-come) a better programmer:


import datetime as dt
from pprint import pprint # just for formatting

def mili_to_date(d):
    """Uses a time in milliseconds since 1970.1.1 (unix time) and creates a string date"""

    d /= 1000.0
    return dt.date.fromtimestamp(d).strftime('%Y-%m-%d')

def toDict(lis):
    """Secret method to map inner list to keys. Shhh - dont tell no one nothing.

    TODO: Also, when time, implement tests to assure length-equality between mapping and 
    input as well as some error handling if the 'Date' is not a number or something is 
    None. Lenght euqality is important as zip will only work for as much as the shorter
    list is long. If its shorter then length of formatter, some dict keys will not occure.
    Look at itertools.zip_longest() for a zip that fills the shorter lists with defaults."""

    formatter = ['Date', 'Open', 'Close', 'High', 'Low', 'Volume']
    z = zip(formatter,lis) 
    return { key: mili_to_date(val) if key == 'Date' else val for key,val in z}

if __name__ == "__main__": 
    # make me a dictionary
    li = [[1364770800000, 93.2, 93.033, 93.29, 92.9, 116.0018],
          [1364774400000, 93.25, 93.1, 100, 93.03, 345.58388931]]
    L = [toDict(x) for x in li] 
    pprint(L)  

Output:

[{'Close': 93.033,
  'Date': '2013-04-01',
  'High': 93.29,
  'Low': 92.9,
  'Open': 93.2,
  'Volume': 116.0018},
 {'Close': 93.1,
  'Date': '2013-04-01',
  'High': 100,
  'Low': 93.03,
  'Open': 93.25,
  'Volume': 345.58388931}]
Sign up to request clarification or add additional context in comments.

2 Comments

Thank you very much for replying. So in your code above putting brackets around key,value would that means we now have tuples in side a dict?
@MightAsWell No, that simply means I screwed up and returned a list of sets of tuples instead of what you wanted. Fixed it, thanks for the pointer :) - So last advice: triple-check your wanted outputs and what you deliver ;)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.