Как создать несколько словарей из списка строк? - PullRequest
2 голосов
/ 23 мая 2019

У меня есть переменная, которая содержит список строк.Для каждой строки в списке я хотел бы создать новый словарь, а затем обновить каждый словарь с этим значением строки.Это приведет к созданию 100 новых словарей.Например, моя переменная выглядит примерно так ...

q)stock
"APPL"
"TSLA"
"AMZN"
"MSFT"
"NVDA"
..
q)count stock
100

Я знаю, как это сделать для отдельной строки в переменной ...

q)newdict:()!()
q)stock:"AAPL"
q)newdict[`ticker]:stock
q)newdict
ticker|"AAPL"

Но как бы я это сделалэто для переменной, которая является списком из 100 строк?Кроме того, если я хотел обновить словарь, чтобы включить дополнительные пары key:value из другой переменной с таким же количеством (как показано ниже), какой правильный синтаксис использовать для этой операции?

q)date
2019.05.23T13:03:55.271474000 2019.05.23T13:03:55.271474000...
q)count date
100

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

q)newdictAPPL
ticker|"APPL"
datetime|2019.05.23T13:03:55.271474000

q)newdictTSLA
ticker|"TSLA"
datetime|2019.05.23T13:05:33.727845200

q)newdictAMZN
ticker|"AMZN"
datetime|2019.05.23T13:08:27.742968000

1 Ответ

2 голосов
/ 23 мая 2019

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

q)stock:20?("AAPL";"TSLA";"MSFT";"AMZN")
q)date:20?.z.Z
q)0N!stock;
("AMZN";"MSFT";"AMZN";"MSFT";"AAPL";"TSLA";"TSLA";"MSFT";"TSLA";"AAPL";"TSLA"..
q)date
2016.09.16T16:06:23.573 2010.10.04T23:28:53.863 2001.03.12T15:16:04.379 2005...

Мы можем довольно просто построить таблицу в kdb:

q)t:([]ticker:stock;datetime:date)
q)t
ticker datetime               
------------------------------
"AMZN" 2016.09.16T16:06:23.573
"MSFT" 2010.10.04T23:28:53.863
"AMZN" 2001.03.12T15:16:04.379
"MSFT" 2005.07.17T04:02:58.577
"AAPL" 2012.12.17T10:48:15.839
"TSLA" 2017.09.16T11:06:02.579
"TSLA" 2002.11.18T00:03:57.945
"MSFT" 2009.06.02T08:28:32.680
"TSLA" 2013.10.24T06:50:31.420
"AAPL" 2007.06.12T07:04:33.058
"TSLA" 2006.08.10T03:45:58.748
"AAPL" 2001.01.17T11:04:57.387
"AAPL" 2010.08.29T21:47:39.564
"MSFT" 2003.10.19T01:58:58.820
"AMZN" 2010.11.21T00:05:03.256
"MSFT" 2001.05.13T21:03:21.293
"TSLA" 2004.02.13T07:49:57.013
"AAPL" 2015.01.31T08:13:03.986
"MSFT" 2009.05.24T06:34:05.044
"TSLA" 2013.03.28T22:11:03.641

Мы можем видеть, что таблица в kdb - это списокСловари, мы можем индексировать и получать отдельные словари:

q)t[0]
ticker  | "AMZN"
datetime| 2016.09.16T16:06:23.573
q)t[1]
ticker  | "MSFT"
datetime| 2010.10.04T23:28:53.863

Мы также можем сериализовать в JSON, используя встроенную .j.j функцию:

q).j.j t
"[{\"ticker\":\"AMZN\",\"datetime\":\"2016-09-16T16:06:23.573\"},{\"ticker\":..

Илиесли мы хотим, чтобы каждый dict представлял собой отдельные строки JSON:

q).j.j each t
"{\"ticker\":\"AMZN\",\"datetime\":\"2016-09-16T16:06:23.573\"}"
"{\"ticker\":\"MSFT\",\"datetime\":\"2010-10-04T23:28:53.863\"}"
"{\"ticker\":\"AMZN\",\"datetime\":\"2001-03-12T15:16:04.379\"}"
"{\"ticker\":\"MSFT\",\"datetime\":\"2005-07-17T04:02:58.577\"}"
"{\"ticker\":\"AAPL\",\"datetime\":\"2012-12-17T10:48:15.839\"}"
"{\"ticker\":\"TSLA\",\"datetime\":\"2017-09-16T11:06:02.579\"}"
"{\"ticker\":\"TSLA\",\"datetime\":\"2002-11-18T00:03:57.945\"}"
..
...