1
votes

Python - texte brut vers la liste des dictionnaires

J'ai la chaîne suivante qui doit être convertie en une liste de dictés.

'"Date", "Volume / Longueur", "Longueur / Largeur", "Poids gm": "08-Dec-2018", "23.19", "2.13", "1.32": "08 -Jan-2019 "," 22.70 "," 5.22 "," 1.02 ": '

Quelle serait la manière pythonique de faire cela? Les clés seraient "Date", "Volume / Longueur", "Longueur / Largeur", "Poids gm"


1 commentaires

On dirait que vous pouvez diviser en deux points pour obtenir chaque ligne, puis diviser en virgules dans une ligne pour obtenir chaque champ.


3 Réponses :


2
votes

Commencez par convertir la chaîne en une liste imbriquée, où chaque liste interne représente une ligne:

{'Date': ('08-Dec-2018', '08-Jan-2019'), 
 'Volume/Length': ('23.19', '22.70'), 
 'Length/Width': ('2.13', '5.22'), 
 'Weight gm': ('1.32', '1.02')}

Puis transposez le list afin que chaque liste interne représente désormais une colonne . Dans chaque colonne, le premier élément est le nom de la colonne et le reste sont les valeurs de cette colonne. Selon ce schéma, nous pouvons effectuer un découpage pour obtenir des paires clé-valeur pour le dict final :

transposed_list = list(zip(*nested_list))
result = {column[0]: column[1:] for column in transposed_list}

# This part can be changed to list(column[1:]) if you want the inner elements to be lists

print(result)

Output:

import re

string = '"Date","Volume/Length","Length/Width","Weight gm":"08-Dec-2018","       23.19","        2.13","        1.32":"08-Jan-2019","       22.70","        5.22","        1.02":'

nested_list = [[value.strip() for value in row.replace('"', '').split(',')] for row in string.strip(':').split(':')]

# Colons divide rows, so there shouldn't be any at the ends


2 commentaires

>>> s = '"Date", "Volume / Longueur", "Longueur / Largeur", "Poids gm": "08-Dec-2018", "23.19", "2.13", "1.32": "08-Jan-2019", "22.70", "5.22", "1.02": '>>> s.strip (': '). Split (': ') [' "Date", "Volume / Length" , "Longueur / Largeur", "Poids gm" ', "" 08-déc.-2018 "," 23.19 "," 2.13 "," 1.32 "'," "08-Jan-2019", "22.70", "5.22 "," 1.02 "'] avec split (': ') - Je m'attendais à une liste de listes plutôt qu'à une liste de chaînes - voyez-vous la même chose?


Non, vous devez fractionner deux fois pour obtenir une liste de listes .



1
votes

Commencez par extraire les clés sous forme de liste et les valeurs sous forme de liste de listes comme ci-dessous

dict_list = []
for value in values:
    dct = {}
    for idx, key in enumerate(keys):
        dct[key] = value[idx]
    dict_list.append(dct)
print(dict_list)
#{'Date': '08-Dec-2018', 'Volume/Length': '23.19', 
#'Length/Width': '2.13', 'Weight gm': '1.32'}, 
#{'Date': '08-Jan-2019', 'Volume/Length': '22.70', 
#'Length/Width': '5.22', 'Weight gm': '1.02'}]

Après cela, vous pouvez utiliser des clés et des valeurs pour le convertir en une liste de dictionnaires

s = '"Date","Volume/Length","Length/Width","Weight gm":"08-Dec-2018","       23.19","        2.13","        1.32":"08-Jan-2019","       22.70","        5.22","        1.02":'

rows = s.split(':')
keys = rows[0].replace('"','').split(',')
# List of all keys
print(keys)
#['Date', 'Volume/Length', 'Length/Width', 'Weight gm']

values = []
for i in range(1,len(rows)-1):
    elems = rows[i].split(',')
    value = []
    for elem in elems:
        parsed_elem = elem.replace('"','').strip()
        value.append(parsed_elem)
    values.append(value)
#List of all values, as a list of lists
print(values)
#[['08-Dec-2018', '23.19', '2.13', '1.32'], ['08-Jan-2019', '22.70', '5.22', '1.02']]


0 commentaires

0
votes

Vous pouvez essayer ceci

input_str = '"Date","Volume/Length","Length/Width","Weight gm":"08-Dec-2018","       23.19","        2.13","        1.32":"08-Jan-2019","       22.70","        5.22","        1.02":'

input_str_formatted = input_str.replace('"', '')
input_list = input_str_formatted.split(':')

key_list = input_list[0].split(',')
val_list_1 = map( lambda x: x.strip() , input_list[1].split(',') )
val_list_2 = map( lambda x: x.strip() , input_list[2].split(',') )

result_dict = { key_list[i] : ( val_list_1[i], val_list_2[i] ) for i in range(len(key_list)) }

J'espère que cela vous aidera.


0 commentaires