【问题标题】:Collapse duplicates in python list [duplicate]折叠python列表中的重复项[重复]
【发布时间】:2017-06-29 23:16:59
【问题描述】:

对不起,如果这是一个重复的线程,但我找不到。

我目前正在尝试为正在开发的游戏制作库存。我遇到的问题是,当你有很多特定的项目时,它会浪费很多空间。

这是我的代码:(inv 是库存)

inv = ["item1","item2","item3","item2","item2","item1"]

print(', '.join(inventory))

输出:

item1, item2, item3, item2, item2, item1

我不想这样做,而是这样做:

item1 x2, item2 x3, item3

我真的不在乎您是否需要将 item3 设为 x1,无论哪种方式都可以,谢谢。

【问题讨论】:

  • x2、x3 是从哪里来的?你的代码中没有提到它?你到底想要产生什么背后的想法是什么?您要在这里解决的问题是什么?
  • 嗯,这就是我希望它这样做的原因......请再读一遍我的问题:)
  • @idjaw:这是一个“2 倍”修饰符。
  • 哦!我现在看到了。这看起来像是 Counter 的工作

标签: python


【解决方案1】:

实际上有很多选择。主要目标是清点您的物品,并按顺序打印出来。

一种选择是使用collections.OrderedDict。其他的是collections.Counter/collections.defaultdict,不过我给大家举个例子:

from collections import OrderedDict

counter = OrderedDict()

inv = ["item1", "item2", "item3", "item2", "item2", "item1"]
for i in inv:
    if i not in counter:
        counter[i] = 0

    counter[i] += 1

for c in counter:
    if counter[c] > 1:
        print(c + ' x{}'.format(counter[c]))
    else:
        print(c)

打印出来:

item1 x2
item2 x3
item3

如果您想在一行中打印出来,您可以根据需要随意修改此示例。这段代码是用python3.x编写的。

【讨论】:

  • @RyanTartaglia 确实如此。如果你在 python3 上,你可以使用print(..., end=', ')。如果您使用的是 python 2,请首先使用 from __future__ import print_function 导入 print 并执行此操作。
  • @RyanTartaglia 你必须在两个打印语句中都这样做:)
  • @RyanTartaglia 不用担心。欢迎来到 StackOverflow。由于您是新手,请考虑阅读this。干杯。 :)
  • @RyanTartaglia 注意到您撤销了接受。怎么了?有什么可以帮忙的吗?
  • @RyanTartaglia 嘿,不用担心。作为提问者,您没有义务接受。但谢谢你这样做。 :)
【解决方案2】:

这是Counter 的示例:

from collections import Counter

inv = ["item1", "item2", "item3", "item2", "item2", "item1"]

print (', '.join('%s x%d' % (item, count)
                 for item, count in sorted(Counter(inv).items())))

【讨论】:

    【解决方案3】:
    out = ['{} x{}'.format(item, inv.count(item)) if inv.count(item) > 1 else item 
       for item in set(inv)]
    

    出来:

    ['item1 x2', 'item2 x3', 'item3']
    

    【讨论】:

    • 与 Prune 的答案相同,但可读性较差...
    • 我倾向于在这里同意@Coldspeed。当您必须开始将列表推导拆分为多行时,您需要考虑将其重构为一个普通的 for 循环。
    • 我认为这是一个有效的观点,虽然我不喜欢占用大量空间来进行简单的操作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-02
    • 1970-01-01
    • 2021-04-17
    • 2020-10-03
    • 1970-01-01
    • 2011-10-04
    • 2019-08-03
    相关资源
    最近更新 更多