Как объединить несколько списков в dict с помощью Python?

#python #json

#python #json

Вопрос:

Я использую Python для перевода текстового файла в JSON. Однако, когда я повторял строки из txt, результат содержал там несколько списков, и мне не удалось объединить список в dict с помощью функции zip() . Кто-нибудь может помочь мне разобраться? Я застрял здесь на пару часов. Спасибо.

  with open(path, encoding='utf-8-sig') as f:
    seq = re.compile("[|]")
    for line_num, line in enumerate(f.readlines()):
        result = seq.split(line.strip("n"))
        print(result)
  

Это вывод:

 ['Delivery', 'Customer Name', 'Shipment Priority', 'Creation Date', 'Customer Number', 'Batch Name', 'Release Date']
['69328624', 'Zhidi Feng', 'Standard Priority', '13-OCT-20', '432579', '19657423', '13-OCT-20 00:01:07']
['69328677', 'Zhengguo Huang', 'Standard Priority', '13-OCT-20', '429085', '19657425', '13-OCT-20 00:01:34']
  

Комментарии:

1. Кстати, в ответе первый список — это имя столбца, которое предполагается использовать в качестве ключа, а следующие значения являются значениями.

2. Пожалуйста, обновите вопрос, чтобы показать ожидаемый результат.

3. Кстати, вы должны посмотреть, может ли встроенный csv модуль помочь вам прочитать и интерпретировать файл.

Ответ №1:

Что-то вроде этого?

 >>> lists = [["12", "Abc", "def"], ["34", "Ghi", "jkl"]]
>>> fields = ["id", "lastname", "firstname"]
>>> dicts = []
>>> for l in lists:
...     d = {}
...     for i in range(3):
...             d[fields[i]] = l[i]
...     dicts.append(d)
>>> dicts
[{'id': '12', 'lastname': 'Abc', 'firstname': 'def'}, 
{'id': '34', 'lastname': 'Ghi', 'firstname': 'jkl'}]
  

Редактировать: включено в ваш существующий код:

     dicts = []
    for line_num, line in enumerate(f.readlines()):
        result = seq.split(line.strip("n"))
        if line_num = 0:
            keys = result
        else:
            d = {}
            for i, key in enumerate(keys):
                d[key] = result[i]
            dicts.append(d)

  

(Я не проверял это, так как у меня нет файла, который вы используете)

Комментарии:

1. Рекомендуем изменить имя list переменной на что-то другое, поскольку оно перезаписывает встроенное.

2. Привет, Марк, спасибо за заметки, очень похоже на это, но странно то, что тип переменной result вообще не является списком, он больше похож на параллельный набор списков, позвольте мне дать вам кое-что еще, <class ‘list’>> <class ‘list’> <class ‘list’> <class ‘list’> <class ‘list’>

3. [‘Delivery’, ‘Customer Name’, ‘Приоритет отправки’, ‘Дата создания’, ‘Номер клиента’, ‘Название партии’, ‘Дата выпуска’] это самый первый столбец, и я хочу использовать его в качестве ключа в Dict, и [‘69328624’, ‘Zhidi Feng’, ‘Стандартный приоритет’, ’13 октября-20′, ‘432579’, ‘19657423’, ’13- ОКТЯБРЬ-20 00:01:07′] [‘69328677’, ‘ Чжэнго Хуан», «Стандартный приоритет», «13-20 ОКТЯБРЯ», ‘429085’, ‘19657425’, ’13- OCT-20 00:01:34′] это предстоящие ответы, которые я хочу использовать в качестве значений в Dict.

4. Будет проще, если вы сможете вставить ответ в Sublime Text, и вы увидите, что формат не является типичным [[xx, yy], [ee, rr]]

5. замените поля на data[0] и списки на data[1:]

Ответ №2:

вы можете использовать zip для создания такого словаря. (Я разделяю ключи и значения в двух списках.)

 with open(path, encoding='utf-8-sig') as f:
    seq = re.compile("[|]")
    lines = f.readlines()
    keys = lines[0] # stting keys
    dict_list = []
    for line_num, line in enumerate(lines[1:]):
        result = seq.split(line.strip("n"))
        dict_list.append(dict(zip(keys, result))) # making a dict and append it to list


  

Комментарии:

1. Привет, Ареф, спасибо за ваши заметки, да, zip() — моя конечная цель, но текущая проблема заключается в том, что мне не удалось сгенерировать здесь два отдельных списка. Я хочу получить первый список из моего результата в качестве ключа, а следующий — в качестве значения.

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

3. Да, Ареф, как только я прочитал код от Marc, я понял, как я попал в ловушку функции list и потерял себя.

Ответ №3:

 >>> total
[['Delivery', 'Customer Name', 'Shipment Priority', 'Creation Date', 'Customer Number', 'Batch Name', 'Release Date'], ['69328624', 'Zhidi Feng', 'Standard Priority', '13-OCT-20', '432579', '19657423', '13-OCT-20 00:01:07'], ['69328677', 'Zhengguo Huang', 'Standard Priority', '13-OCT-20', '429085', '19657425', '13-OCT-20 00:01:34']]
>>> keys = total[0]
>>> 
>>> values = total[1:]
>>> wanted = [ dict(zip(keys, value)) for value in values]
>>> wanted
[{'Delivery': '69328624', 'Customer Name': 'Zhidi Feng', 'Shipment Priority': 'Standard Priority', 'Creation Date': '13-OCT-20', 'Customer Number': '432579', 'Batch Name': '19657423', 'Release Date': '13-OCT-20 00:01:07'}, {'Delivery': '69328677', 'Customer Name': 'Zhengguo Huang', 'Shipment Priority': 'Standard Priority', 'Creation Date': '13-OCT-20', 'Customer Number': '429085', 'Batch Name': '19657425', 'Release Date': '13-OCT-20 00:01:34'}]


  

Комментарии:

1. Спасибо, кай! Ваша идея также приветствуется.