【问题标题】:Count and sum all previous like terms计算和总结所有以前的类似术语
【发布时间】:2016-01-17 05:53:47
【问题描述】:

假设我们有一个术语列表:

termList = ["A", "A", "B", "C", "C", "C", "E"]


现在,假设我们有另一个列表,包含更多列表:

otherList = [["A, "E"], ["A", "B", "C", "C"], ["B", "B"], ["A", "C"]]


我想做的是对于otherList的每个索引,检查它的每个term的总和加上之前所有索引的总和,看看每个term的总数没有超过termList中的总和。

例如:

  • 迭代 1:A (1),E (1)
  • 迭代 2:A (2)、B (1)、C (2)、E (1)
  • 迭代 3:发现 B 有 3 个实例。这不仅仅是 termList 中存在的一个实例,因此循环结束。

我被困在如何在不嵌套一百万个循环的情况下做到这一点。我想我们可以使用生成器表达式allsum 的组合,但不能完全弄清楚如何添加所有前面的项并检查所有总和是否有效。

【问题讨论】:

  • 我在这里只看到 3 个循环 - 计算 termlist 元素、获取 otherList 元素(子列表)、计算子列表元素(并将结果添加到全局总和)。也许使用“collections.Counter()”可能是一个循环。
  • 基本上你希望在一个扁平的 andca 嵌套列表中计算每个值的计数并比较它们?

标签: python list loops count sum


【解决方案1】:

Counters 适合您,您可以将它们加在一起:

from collections import Counter
termList = ["A", "A", "B", "C", "C", "C", "E"]
otherList = [["A", "E"], ["A", "B", "C", "C"], ["B", "B"], ["A", "C"]]

term_count = Counter(termList)
c = Counter()
for lst in otherList:
    c += Counter(lst)
    if any(c[v] > term_count[v] for v in c):
        break
    print(c)
else:
    print('Exhausted')

输出:

Counter({'A': 1, 'E': 1})
Counter({'C': 2, 'A': 2, 'B': 1, 'E': 1})

【讨论】:

  • 啊,我想这就是我想要的。你的输出是正确的还是第三行实际上是“Exhausted”?
  • for 循环的else 子句仅在循环不break 时执行,因此Exhausted 仅在到达otherList 的末尾时才会打印。在条件之后移动了print(c),因此只输出所需的详细信息。
  • 我读得很快,抱歉。我的意思是问它是否应该打破,但后来看到你在支票之前有你的打印声明。编辑更好;谢谢
【解决方案2】:

这是作业吗?一种方法是使用两个字典。遍历第一个列表并为每个实例将字典值增加 1。您的示例的输出将是:{ 'A' : 2, 'B' : 1, 'C': 3, 'E' : 1 }。接下来遍历其他列表中的每个列表,并使用单独的字典执行相同的操作。输出将是:{ 'A' : 3, 'E' : 1, 'B' : 3, 'C' : 3 }

现在比较您的列表(或者在您遍历第二个列表时进行比较)。您可能还希望使用defaultdict 为您的字典返回0 作为默认值。这让您不必担心关键错误。

另外,这句话中前面的意思也不是很清楚。

检查每个词的总和加上所有以前的索引,看看每个词的总量没有超过termList中的总和。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-13
    • 2011-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-28
    相关资源
    最近更新 更多