我在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)
非常感谢所有帮助!
答案 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)