Apakah ada satu baris yang elegan untuk mengubah jenis string ini menjadi dict? Saya mencari di Google sekarang selama satu jam, tetapi tanpa beberapa loop pemisahan string saya tidak bisa membuatnya berfungsi.

Input  = "2:9, 6:90, 7:60"
Output = {'2': 9, '6': 90, '7': 60}

Saya juga membutuhkan operasi terbalik dari dict ke string.

-1
canedha 7 Januari 2021, 23:59

4 jawaban

Jawaban Terbaik

Dari segi kinerja, yang paling efisien adalah loop for normal:

my_string = "2:9, 6:90, 7:60"
my_dict = {}
for s in my_string.split(', '):
     k, v = s.split(":")
     my_dict[k] = int(v)

Di mana my_dict akan berisi:

>>> my_dict
{'2': 9, '7': 60, '6': 90}

Untuk mendapatkan kembali string yang sama, Anda dapat melakukan .join() pada dict.items() sebagai:

>>> ", ".join("{}:{}".format(k, v) for k, v in my_dict.items())
'2:9, 7:60, 6:90'

Atau, Anda juga dapat mengetikkan dict ke string dan melakukan beberapa pemformatan seperti:

>>> str(my_dict)[1:-1].replace(": ", ":").replace("'", "")
'2:9, 7:60, 6:90'
2
Anonymous 7 Januari 2021, 21:20

Anda dapat menggunakan ast.literal_eval dan str sederhana, cukup singkirkan tanda kurung awal:

import ast

inputString  = "2:9, 6:90, 7:60"
outputDict = ast.literal_eval("{" + inputString + "}")
outputString = str(outputDict)[1:-1]

Satu hal yang perlu diperhatikan: tidak jelas kapan konversi dari string ke angka dari contoh Anda terjadi: ast.literal_eval akan memberi Anda kunci angka kecuali Anda menentukan dengan tanda kutip.

0
M Z 7 Januari 2021, 21:07

Anda dapat menggunakan ast.literal_eval dan meletakkan tanda kurung di setiap ujung string meskipun kunci Anda adalah int bukan string.

from ast import literal_eval

Input  = "2:9, 6:90, 7:60"

Output = literal_eval(f"{{{input}}}")

{2: 9, 6: 90, 7: 60}

Untuk memperbaiki output menjadi kunci string, cukup konversikan dengan tangan

Output = dict(zip(map(str, Output), Output.values()))

{'2': 9, '7': 60, '6': 90}

Tanpa mengimpor pustaka apa pun, Anda perlu menggunakan str.split

Output = dict(s.split(':') for s in Input.split(', '))

{'2': '9', '6': '90', '7': '60'}

Meskipun sekarang nilai Anda adalah string sehingga Anda harus memperbaikinya.

Output = dict(zip(Output, map(int, Output.values())))

{'2': 9, '7': 60, '6': 90}
0
Jab 7 Januari 2021, 21:21

Nah tanpa mengajukan pertanyaan, jika Anda menginginkan satu liner yang membuat kunci menjadi string dan nilainya menjadi int:

dict([[j[0].strip(), int(j[1])] for j in [i.split(':') for i in Input.split(',')]])
0
Hussain Hassam 7 Januari 2021, 21:16