【问题标题】:Best way to remove/merge duplicates in this list?删除/合并此列表中重复项的最佳方法?
【发布时间】:2015-11-02 11:11:00
【问题描述】:

我得到了一个这样组成的列表:

item_list = [
    [ObjectB, 9],
    [ObjectA, 2],
    [ObjectB, 5],
    [ObjectC, 8],
    [ObjectA, 7]
]

如您所见,ObjectA 和 ObjectB 在此列表中出现了两次。左列定义它是哪种项目,右列定义我需要它的频率。因此,我想得到这样的结果:

item_list = [
    [ObjectB, 14],
    [ObjectA, 9],
    [ObjectC, 8],
]

[ObjectB, 9][ObjectB, 5] 合并为 [ObjectB, 14]ObjectA 的出现也是如此。 实现这一目标的最佳方法是什么?我尝试了几种解决方案,但我觉得有一个非常简单有效的解决方案。

【问题讨论】:

  • 试着把它转换成字典

标签: python list merge


【解决方案1】:

很明显,字典会很方便地解决您的问题:

d = defaultdict(int)
for k, v in item_list:  # unwrapping credits to @clemtoy
    d[k] += v
result = [[k, v] for k, v in d.iteritems()]

所以你首先要做的是创建一个defaultdict,使用int 作为工厂方法。这意味着如果您尝试访问字典中不存在的任何键,您将得到0

接下来,您开始填充字典,方法是增加键的值。如果密钥还没有在字典中,您将从0 开始。

现在终于要转换回你想要的结构,你需要最后一行 - 列表理解。你的result 将是:

[[ObjectA, 9], [ObjectB, 14], [ObjectC, 8]]

此外,如果您需要对其进行排序,请继续:

result = sorted(result, key=itemgetter(1), reverse=True)))

这将使用每个元素的第二个子元素按降序对您的result 进行排序。

【讨论】:

  • 不错!但for k, v in item_list: d[k] += v 在我看来是最可爱的!
  • 完美解决!谢谢!
【解决方案2】:

像这样?

ObjectA = "hello"
ObjectB = "cruel"
ObjectC = "world"

item_list = [
    [ObjectB, 9],
    [ObjectA, 2],
    [ObjectB, 5],
    [ObjectC, 8],
    [ObjectA, 7]
]

sum = {}
for item in item_list:
    sum[item[0]] = sum.get(item[0], 0) + item[1]
print(sum)

{'世界': 8, '残忍': 14, '你好': 9}

【讨论】:

    猜你喜欢
    • 2013-05-03
    • 2018-03-13
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-07
    • 2010-12-13
    相关资源
    最近更新 更多