计算元组在输出结果中出现的次数

时间:2016-02-05 09:06:10

标签: python list

我想计算一个元组在我的输出'结果'中出现的次数(我改进了我以前的问题How to join many “listed” tuples into one tuple in Python?)。

所以我这样做了:

from collections import Counter
liste = [1,2,3,5,10]
liste2 = [[1,2,3,5,10], [1,2], [1,5,10], [3,5,10], [1,2,5,10]]
for elt in liste2:
    syn = elt # identify each sublist of liste2 as syn
    nTuple = len(syn)   # number of elements in the syn
    for i in liste:
        myTuple = ()
        if syn.count(i): # check if an item of liste is in liste2
               myTuple = (i, nTuple)
               if len(myTuple) == '0': # remove the empty tuples
                  del(myTuple)
        else:
            result = [myTuple] 
            c = Counter(result)
            for item in c.items():
                print(item)

我得到了这些结果:

  

((1,5),1)

     

((2,5),1)

     

((3,5),1)

     

((5,5),1)

     

((10,5),1)

     

((1,2),1)

     

((2,2),1)

     

((1,3),1)

     

((5,3),1)

     

((10,3),1)

     

((3,3),1)

     

((5,3),1)

     

((10,3),1)

     

((1,4),1)

     

((2,4),1)

     

((5,4),1)

     

((10,4),1)

而不是有一些elts N次(例如((5,3),1)((10,3),1)出现两次),I想要一个元组(键,值),其中value =键出现在'结果'中的次数。

我想像这样得到'结果':

  

((1,5),1)

     

((2,5),1)

     

((3,5),1)

     

((5,5),1)

     

((10,5),1)

     

((1,2),1)

     

((2,2),1)

     

((1,3),1)

     

((5,3), 2

     

((10,3), 2

     

((3,3),1)

     

((1,4),1)

     

((2,4),1)

     

((5,4),1)

     

((10,4),1)

由于

2 个答案:

答案 0 :(得分:1)

我认为问题就在于此:

c = Counter(result)

每次迭代,你都在创建一个新的计数器,如果你在开始时实例化一个计数器,然后在事实之后输出它的元素,我希望你能得到你需要的输出:

from collections import Counter
liste = [1,2,3,5,10]
liste2 = [[1,2,3,5,10], [1,2], [1,5,10], [3,5,10], [1,2,5,10]]
c = Counter()
for elt in liste2:
    syn = elt # identify each sublist of liste2 as syn
    nTuple = len(syn)   # number of elements in the syn
    for i in liste:
        myTuple = ()
        if syn.count(i): # check if an item of liste is in liste2
               myTuple = (i, nTuple)
               if len(myTuple) == 0: # remove the empty tuples
                  del(myTuple)
               else:
                   result = myTuple
                   c[result] += 1
for item in c.items():
    print(item)

需要进行的其他更改是将物品放入柜台的位置以及放入物品的位置。见上面的代码。

编辑了解决方案,以便回答您的​​问题。

编辑,最初甚至没有注意到if语句中的错误。如果len(myTuple)== 0实际上是多余的,因为在这里不会创建空元组。您的示例中有几个冗余行。以下代码将完全相同:

from collections import Counter
liste = [1,2,3,5,10]
liste2 = [[1,2,3,5,10], [1,2], [1,5,10], [3,5,10], [1,2,5,10]]
c = Counter()
for elt in liste2:
    nTuple = len(elt)   # number of elements in the syn
    for i in liste:
        if elt.count(i): 
               myTuple = (i, nTuple)
               c[myTuple] += 1
for item in c.items():
    print(item)

正如我在评论中所说,你可以通过将其封装在一个函数中来干净地运行:

>>> from collections import Counter
... liste = [1,2,3,5,10]
... liste2 = [[1,2,3,5,10], [1,2], [1,5,10], [3,5,10], [1,2,5,10]]
... def get_syncounts(liste, liste2):
...     c = Counter()
...     for elt in liste2:
...         nTuple = len(elt)   # number of elements in the syn
...         for i in liste:
...             if elt.count(i): 
...                    myTuple = (i, nTuple)
...                    c[myTuple] += 1
...     for item in c.items():
...         print(item)
>>> get_syncounts(liste, liste2)
((1, 2), 1)
((10, 5), 1)
((1, 3), 1)
((5, 5), 1)
((5, 4), 1)
((1, 4), 1)
((1, 5), 1)
((10, 4), 1)
((2, 2), 1)
((3, 3), 1)
((2, 5), 1)
((5, 3), 2)
((10, 3), 2)
((2, 4), 1)
((3, 5), 1)
>>> get_syncounts(liste, liste2)
((1, 2), 1)
((10, 5), 1)
((1, 3), 1)
((5, 5), 1)
((5, 4), 1)
((1, 4), 1)
((1, 5), 1)
((10, 4), 1)
((2, 2), 1)
((3, 3), 1)
((2, 5), 1)
((5, 3), 2)
((10, 3), 2)
((2, 4), 1)
((3, 5), 1)
>>> 

答案 1 :(得分:0)

您可以每次将结果附加到列表中,然后在追加到列表之前,您可以检查该元素是否存在于列表中。 这样你可以避免重复。

    store_results = [] 
    if result not in store_result:
             store_result.append(result)

然后列表很容易转换为元组

print tuple(store_results)