Групповой список в Python, как показать только значение элемента, когда значение элемента> 1

1

У меня есть список в 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)

вся помощь очень ценится!

Теги:
python-3.x

3 ответа

1

Проблема в том, что вы исчерпываете итеративное значение при первом использовании (в 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)
  • 1
    Спасибо за четкий ответ. Это сработало очень легко. Я знал, что это было просто быстрое решение. Я все еще начинающий, поэтому я скучаю по некоторым из этих вещей! еще раз спасибо!!!
1

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 
0

Вы можете просто создать список из сгруппированных значений и проверить его длину:

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)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню