Как в цикле посчитать количество повторов в строке? Python
Работаю с апи одного проекта и у меня проблема в том, что когда я в цикле прохожусь по словарю чтобы создать более менее нормальный текст, то у меня куча повторов, как мне их убрать и оставить всего один екземпляр текста, а рядом в скобках написать количество, показываю код:
result = ''
for i in resp['Items']:
title = 'Название: '+i['Title'] + '\n'
price = 'Цена: '+ str(i['MarketPrice']['Amount']) + '$\n'
result += '\n'+title+price+'------------------------------------------------------------'
Что получаю:
Название: Snakebite Case
Цена на Dmarket: 0.1$
------------------------------------------------------------
Название: Horizon Case
Цена на Dmarket: 0.17$
------------------------------------------------------------
Название: Prisma Case
Цена на Dmarket: 0.12$
------------------------------------------------------------
Название: Sticker | Ancient Beast
Цена на Dmarket: 0.09$
------------------------------------------------------------
Название: Snakebite Case
Цена на Dmarket: 0.1$
------------------------------------------------------------
Как видите названия повторяются, я хочу совместить их и рядом в скобках указать количество например (x2)
Пример того что хочу увидеть:
Название: Snakebite Case (х2)
Цена на Dmarket: 0.1$
------------------------------------------------------------
Название: Horizon Case
Цена на Dmarket: 0.17$
------------------------------------------------------------
Название: Prisma Case
Цена на Dmarket: 0.12$
------------------------------------------------------------
Название: Sticker | Ancient Beast
Цена на Dmarket: 0.09$
------------------------------------------------------------
Как выглядит схема
{
"Items": [
{
"AssetID": "string",
"VariantID": "string",
"Title": "string",
"ImageURL": "string",
"GameID": "string",
"GameType": "GameTypeBlockchain",
"Location": "AssetLocationInGame",
"Withdrawable": true,
"Depositable": true,
"Tradable": true,
"Attributes": [
{
"Name": "string",
"Value": "string"
}
],
"Offer": {
"OfferID": "string",
"Price": {
"Currency": "string",
"Amount": 0
},
"Fee": {
"Currency": "string",
"Amount": 0
},
"CreatedDate": "string"
},
"MarketPrice": {
"Currency": "string",
"Amount": 0
},
"InstantPrice": {
"Currency": "string",
"Amount": 0
},
"ClassID": "string"
}
],
"Total": "string",
"Cursor": "string"
}
Ответы (2 шт):
Здравствуйте Kowl ещё раз!, внёс одну малейшую поправочку в 'title', каждый 'title' имеет стартовую единицу (x1), которая инкрементируется при условии, что 'title' уже есть в вашей строке результата
result = ''
for item in items:
if item["Title"] in result:
count = int(result[result.index(item['Title']) + len(item["Title"]) + 3])
result = result.replace(f"{item['Title']} (x{count})", f"{item['Title']} (x{count+1})")
continue
title = f"Название: {item['Title']} (x1)\n"
price = f"Цена: {item['MarketPrice']['Amount']}$\n"
result += "\n" + title + price + ("-" * 60)
По вашей просьбе убрал стартовый х1
result = ''
for item in items:
if item["Title"] in result:
count = result[result.index(item['Title']) + len(item["Title"]) + 3]
if count.isdigit():
count = int(count)
result = result.replace(f"{item['Title']} (x{count})", f"{item['Title']} (x{count+1})")
continue
result = result.replace(f"{item['Title']}", f"{item['Title']} (x{2})")
continue
title = f"Название: {item['Title']}\n"
price = f"Цена: {item['MarketPrice']['Amount']}$\n"
result += "\n" + title + price + ("-" * 60)
Собрать все записи в группы с одинаковыми заголовками и ценами. Распечатать группы:
import collections
def report(resp):
def records():
c = collections.Counter(
(i['Title'], i['MarketPrice']['Amount']) for i in resp['Items']
)
for (title, price), amount in c.items():
factor = f' (x{amount})' if amount > 1 else ''
line1 = f'Название: {title}{factor}'
line2 = f'Цена: {price}$'
yield f'{line1}\n{line2}'
spacer = '-' * 60
return f'\n{spacer}\n'.join(records())
print(report({
'Items': [
{ 'Title': 'Snakebite Case', 'MarketPrice': { 'Amount': 0.1 } },
{ 'Title': 'Horizon Case', 'MarketPrice': { 'Amount': 0.17 } },
{ 'Title': 'Prisma Case', 'MarketPrice': { 'Amount': 0.12 } },
{ 'Title': 'Sticker | Ancient Beast', 'MarketPrice': { 'Amount': 0.09 } },
{ 'Title': 'Snakebite Case', 'MarketPrice': { 'Amount': 0.1 } }
]
}))
Название: Snakebite Case (x2) Цена: 0.1$ ------------------------------------------------------------ Название: Horizon Case Цена: 0.17$ ------------------------------------------------------------ Название: Prisma Case Цена: 0.12$ ------------------------------------------------------------ Название: Sticker | Ancient Beast Цена: 0.09$