У меня есть список в Python, который обрабатывает все элементы, которые пользователь имеет в моей текстовой RPG игре. Я использую модуль groupby для группировки нескольких экземпляров элемента, а затем записываю сумму в скобках рядом с элементом при печати списка. код ниже:
item_inventory["sword", "sword", "jelly", "egg"]
item_list = groupby(sorted(item_inventory))
for k, g in item_list:
print(k, "(" + str(sum(1 for _ in g)) + ")")
вывод выглядит так:
egg (1)
jelly (1)
sword (2)
однако я бы хотел, чтобы количество отображалось только в том случае, если в списке более одного, с таким результатом:
egg
jelly
sword (2)
Я пробовал следующее, но это не сработало:
for k, g in item_list:
if sum(1 for _ in g) > 1:
print(k, "(" + str(sum(1 for _ in g)) + ")")
else:
print(k)
вся помощь очень ценится!
Проблема в том, что вы исчерпываете итеративное значение при первом использовании (в sum(1 for _ in g) > 1
), это должно исправить это:
from itertools import groupby
item_inventory = ["sword", "sword", "jelly", "egg"]
item_list = groupby(sorted(item_inventory))
for k, g in item_list:
count = sum(1 for _ in g)
if count > 1:
print(k, "(" + str(count) + ")")
else:
print(k)
Выход
egg
jelly
sword (2)
Counter
может быть более полезным для этой проблемы:
from collections import Counter
for item,count in Counter(item_inventory).items():
print('{}{}'.format(item, '' if count==1 else " ({})".format(count)))
#sword (2)
#jelly
#egg
Вы можете просто создать список из сгруппированных значений и проверить его длину:
from itertools import groupby
item_inventory = ["sword", "sword", "jelly", "egg"]
item_list = groupby(sorted(item_inventory))
def format_me(items):
l = list(items)
return "" if len(l) == 1 else "({})".format(len(l))
for k, g in item_list:
print(k, format_me(g))
Это напечатает:
egg
jelly
sword (2)