【问题标题】:Multi Dimensional List - Sum Integer Element X by Common String Element Y多维列表 - 将整数元素 X 与公共字符串元素 Y 相加
【发布时间】:2015-05-22 11:08:32
【问题描述】:

我有一个多维列表:

multiDimList = [['a',1],['a',1],['a',1],['b',2],['c',3],['c',3]]

我正在尝试总结元素 [1] 的实例,其中元素 [0] 很常见。

说得更清楚一点,我想要的输出是另一个多维列表:

multiDimListSum = [['a',3],['b',2],['c',6]]

我知道我可以访问,说 multiDimList by 中的值“2”

x = multiDimList [3][1]

所以我可以抓取单个元素,并且可能构建某种功能来完成这项工作,但这会是恶心。

有没有人建议如何以 Python 方式执行此操作?

【问题讨论】:

  • 你说的恶心是什么意思,如果得到理想的输出,任何解决问题的方法都是合理的。
  • 你当然是对的。只是我倾向于编写很臭的代码,作为一个没有经验的编码器,我很自嘲。我总是尝试提供我在 SO 上尝试过的示例,但在这种情况下,我认为我只是离题了。

标签: python arrays multidimensional-array


【解决方案1】:

假设您的实际序列具有与示例中相似的元素组合在一起('a'、'b' 等的所有实例一起),您可以使用itertools.groupby() 和operator.itemgetter():

from itertools import groupby
from operator import itemgetter

[[k, sum(v[1] for v in g)] for k, g in groupby(multiDimList, itemgetter(0))]

# result: [['a', 3], ['b', 2], ['c', 6]]

【讨论】:

【解决方案2】:

Zero Piraeus 的回答涵盖了字段条目按顺序分组的情况。如果不是,那么以下内容很简短且相当有效。

from collections import Counter
reduce(lambda c,x: c.update({x[0]: x[1]}) or c, multiDimList, Counter())

这会返回一个集合,可以通过元素名称访问。如果你喜欢它作为一个列表,你可以调用它的 .items() 方法,但请注意,即使在输入 是 一致排序。

【讨论】:

  • 可能值得一提的是,reduce() 不再是 Python 3.x 中的内置函数,必须从 functools 导入。但是,是的,这是一个很好的解决方案,其中输入没有分组。
【解决方案3】:

您可以使用dict 来累积与每个字符串关联的总数

d = {}
multiDimList = [['a',1],['a',1],['a',1],['b',2],['c',3],['c',3]]
for string, value in multiDimList:
    # Retrieves the current value in the dict if it exists or 0
    current_value = d.get(string, 0) 
    d[string] += value
print d # {'a': 3, 'b': 2, 'c': 6}

然后您可以使用d["b"] 访问b 的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    相关资源
    最近更新 更多