Разбиение строки на Python так, чтобы выход имел разрывы строк AND без "и скобок

-7

У меня есть входная строка, которая выглядит следующим образом:

input_string = [{"name":"Jason","cover":25.1},{"name":"Jake","cover":62.23},{"name":"Amy","cover":70.11}]

Мне нужна строка вывода с line breaks и без " и brackets

output_string_1 = 
name:Jason, cover:25.1
name:Jake, cover:62.23
name:Amy, cover:70.11

Наконец, мне нужна строка вывода 2, которая исключает повторяющиеся термины и имеет | разделитель

output_string_2 = 
name | cover
Jason | 25.1
Jake | 62.23
Amy | 70.11

output_string_1 и output_string_2 должны иметь тип str

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

спросил(а) 2018-10-07T02:15:00+03:00 2 года, 1 месяц назад
0
71

Вы можете использовать ast.literal_eval с str.join, списками и f-строками:


from ast import literal_eval

L = literal_eval(input_string)

print('\n'.join([f'name:{d["name"]}, cover:{d["cover"]}' for d in L]))

name:Jason, cover:25.1
name:Jake, cover:62.23
name:Amy, cover:70.11

print('\n'.join(['name | cover'] + [f'{d["name"]} | {d["cover"]}' for d in L]))

name | cover
Jason | 25.1
Jake | 62.23
Amy | 70.11

ответил(а) 2018-10-07T02:24:00+03:00 2 года, 1 месяц назад
59

Существует функция, называемая ast.literal_eval (string_with_list)

Вы можете ввести свою строку со списком и словарями, а ваш вывод - реальный список dicts.

>>> import ast
>>> a = ast.literal_eval('[{"name":"Jason","cover":25.1},{"name":"Jake","cover":62.23},{"name":"Amy","cover":70.11}]')
>>> print(a)
[{'name': 'Jason', 'cover': 25.1}, {'name': 'Jake', 'cover': 62.23}, {'name': 'Amy', 'cover': 70.11}]

Тогда вы можете легко...

for y in a:
print("name:" + y["name"] + ", cover:" + str(y["cover"]))

Итак, готовый код:

import ast
a = ast.literal_eval('[{"name":"Jason","cover":25.1},{"name":"Jake","cover":62.23},{"name":"Amy","cover":70.11}]')
for y in a:
# [3 STRINGS]
print("name:" + y["name"] + ", cover:" + str(y["cover"]))
output_string_1 = "name:" + a[0]["name"] + ", cover:" + str(a[0]["cover"]) + "\nname:"+ a[1]["name"] + ", cover:" + str(a[1]["cover"]) + "\nname:"+ a[2]["name"] + ", cover:" + str(a[2]["cover"]))
output_string_2 = "name | cover\n" + a[0]["name"] + " | " + str(a[0]["cover"]) + "\n"+ a[1]["name"] + " | " + str(a[1]["cover"]) + "\n"+ a[2]["name"] + " | " + str(a[2]["cover"]))
print(output_string_1)
print(output_string_2)

Результат:

[3 STRINGS]
name:Jason, cover:25.1
name:Jake, cover:62.23
name:Amy, cover:70.11

[1 STRING]
name:Jason, cover:25.1
name:Jake, cover:62.23
name:Amy, cover:70.11

[1 STRING]
name | cover
Jason | 25.1
Jake | 62.23
Amy | 70.11

Если вам нравится мой ответ, проголосуйте за меня!

ответил(а) 2018-10-07T02:29:00+03:00 2 года, 1 месяц назад
58

Вы можете разобрать строку как json в список dicts:

In [11]: lst = json.loads(input_string)

In [12]: print("name | cover")
...: for d in lst:
...: print(d["name"], "|", d["cover"])
...:
name | cover
Jason | 25.1
Jake | 62.23
Amy | 70.11

# To return the string
In [13]: "\n".join(["name | cover"] + [d["name"] + " | " + str(d["cover"]) for d in lst])
Out[13]: 'name | cover\nJason | 25.1\nJake | 62.23\nAmy | 70.11'

ответил(а) 2018-10-07T02:21:00+03:00 2 года, 1 месяц назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема