Автоматическое создание списка словарей на основе двух списков одинаковой длины с Python - PullRequest
0 голосов
/ 04 февраля 2020

Существует два списка:

customer_list = ["A7", "A8", "A9", "A10", "A11"] 
customer_index = ["8", "9", "10", "11", "12"]

Цель состоит в том, чтобы создать следующее:

final_list = [
{
"kind": "report#variable",
"type": "A7",
"value": line[8]}
,
{
"kind": "report#variable",
"type": "A8",
"value": line[9]}
,
{
"kind": "report#variable",
"type": "A9",
"value": line[10]}
,
{
"kind": "report#variable",
"type": "A10",
"value": line[11]}
,
{
"kind": "report#variable",
"type": "A11",
"value": line[12]}
]

Я пытался использовать следующий код Python, но он не работал :

def create_final_list(list_1, list_2):
   new_list = []
   list_prefix = '{"kind": "report#variable",'
   for num in list_1:
      for val in list_2:
         list_1_num = ' "type": ' + num 
         list_2_val = ' "value": ' + val 
         new_list.append(list_prefix + list_1_num + list_2_val)
   return new_list

Как автоматически создать список словарей на основе двух списков одинаковой длины и желаемого формата, как в приведенном выше примере?

Ответы [ 3 ]

3 голосов
/ 04 февраля 2020

Это не JSON; но список словарей, которые вы создаете в списке-понимании с помощью zip():

customer_list = ["A7", "A8", "A9", "A10", "A11"] 
customer_index = ["8", "9", "10", "11", "12"]
line = [1,2,3,4,5,6,7,8,9,101,11,12,13,14]  # assume this `line` list

res = [{"kind": "report#variable", "type": x, "value": line[int(y)]} for x, y in zip(customer_list, customer_index)]

Как и в комментариях, вы можете сделать:

json.dumps(res)

.. для преобразовать res в JSON строку.

1 голос
/ 04 февраля 2020

Try

lis = []
for i in range(len(customer_index)):
    dic = {"type" : customer_list[i], "value" : customer_index[i]}
    lis.append(dic)

Это выводит

[{'type': 'A7', 'value': '8'},
 {'type': 'A8', 'value': '9'},
 {'type': 'A9', 'value': '10'},
 {'type': 'A10', 'value': '11'},
 {'type': 'A11', 'value': '12'}]

Как и в вашем коде, если вы хотите line[8], сделайте line[customer_index[i]] вместо customer_index[i] во время инициализации словаря. Кроме того, добавьте еще 1 ключ kind в словарь в соответствии с вашим требованием.

Приведенный выше код работает, только если оба customer_list и customer_index имеют одинаковую длину, поскольку l oop повторяется n раз, где n равна длине списка.

1 голос
/ 04 февраля 2020

Так как pandas помечен, добавляется еще один способ с использованием фрейма данных и группировки:

df = pd.DataFrame({"kind": "report#variable","type":customer_list,"value":customer_index})
final = [g.droplevel(0).to_dict() for _,g in df.stack().groupby(level=0)]

[{'kind': 'report#variable', 'type': 'A7', 'value': '8'},
 {'kind': 'report#variable', 'type': 'A8', 'value': '9'},
 {'kind': 'report#variable', 'type': 'A9', 'value': '10'},
 {'kind': 'report#variable', 'type': 'A10', 'value': '11'},
 {'kind': 'report#variable', 'type': 'A11', 'value': '12'}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...