计算并总结所有以前的类似术语

时间:2016-01-17 05:53:47

标签: python list loops count sum

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

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

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

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

我想要做的是otherList的每个索引,检查每个术语的总和加上所有先前索引的总和,看看每个术语的总量是否超过{{1}的总和。 1}}。

例如:

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

如果没有嵌套一百万个循环,我会坚持如何做到这一点。我想我们可以使用生成器表达式termListall的组合,但不能完全弄清楚如何添加所有先前的术语,并检查所有总和是否有效。< / p>

2 个答案:

答案 0 :(得分:2)

Counter对您有用,您可以将它们添加到一起:

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})

答案 1 :(得分:0)

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

现在比较您的列表(或者在迭代第二个列表时执行此操作)。您可能还希望使用defaultdict为您的词典返回0作为默认值。这样可以避免因必须考虑关键错误而烦恼。

此句也不清楚你在前面的意思。

  

检查每个字词的总和加上所有之前索引的总和,看看每个字词的总金额是否超过termList