python中的groupby列表,如何仅在item value> 1时显示项目值的数量

时间:2018-12-22 22:50:09

标签: python python-3.x

我在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)

非常感谢所有帮助!

3 个答案:

答案 0 :(得分:2)

问题是您在第一次使用迭代器时(在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 

答案 2 :(得分: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)