【问题标题】:How to count the repetition of the elements in a list python, django如何计算列表中元素的重复python,django
【发布时间】:2013-08-31 13:31:49
【问题描述】:

我有一个 django 应用,我的博客使用 django-taggit

现在我有一个从数据库中获得的元素列表(实际上是对象),如下所示

tags = [<Tag: some>, <Tag: here>, <Tag: tags>, <Tag: some>, <Tag: created>, <Tag: here>, <Tag: tags>]

现在如何查找列表中每个元素的计数并返回元组列表,如下所示

结果应该如下

[(<Tag: some>,2),(<Tag: here>,2),(<Tag: created>,1),(<Tag: tags>,2)]

这样我就可以通过像下面这样循环在模板中使用它们

查看

def display_list_of_tags(request):
    tags = [<Tag: some>, <Tag: here>, <Tag: tags>, <Tag: some>, <Tag: created>, <Tag: here>, <Tag: tags>]
    # After doing some operation on above list as indicated above
    tags_with_count =  [(<Tag: some>,2),(<Tag: here>,2),(<Tag: created>,1),(<Tag: tags>,2)]
    return HttpResponse('some_template.html',dict(tags_with_count:tags_with_count))

模板

{% for tag_obj in tags_with_count %}
   <a href="{% url 'tag_detail' tag_obj %}">{{tag_obj}}</a> <span>count:{{tags_with_count[tag_obj]}}</span>
{% endfor %}

所以如上所述如何计算列表中每个元素的出现次数? 这个过程最终应该很快,因为我在标签应用程序中可能有数百个标签,对吧?

如果列表只包含字符串作为元素,我们可以使用类似from collections import counter 并计算计数,但是在上述情况下怎么办?

我的全部目的是计算出现次数并将它们打印在模板中,例如tag object and occurrences

所以我正在寻找一种快速有效的方法来执行上述功能?

编辑

所以我得到了所需的答案 我通过将结果list of tuples 转换为字典将结果发送到模板,如下所示

{<Tag: created>: 1, <Tag: some>: 2, <Tag: here>: 2, <Tag: tags>: 2}

并尝试通过以

之类的格式循环打印上述字典
{% for tag_obj in tags_with_count %}
       <a href="{% url 'tag_detail' tag_obj %}">{{tag_obj}}</a> <span>count:{{tags_with_count[tag_obj]}}</span>
    {% endfor %}

但它显示以下错误

TemplateSyntaxError: Could not parse the remainder: '[tag_obj]' from 'tags_with_count[tag_obj]'

那么如何在django模板中通过like key和value来显示字典呢?

完成后我们可以改变上面的模板循环如下

{% for tag_obj, count in tags_with_count.iteritems %}

【问题讨论】:

标签: python django list count django-taggit


【解决方案1】:

试试 Python 的Counter:

from collections import Counter

l =  ['some', 'here', 'tags', 'some', 'created', 'here', 'tags']
print(Counter(l).items())

输出:

[('created', 1), ('some', 2), ('here', 2), ('tags', 2)]

【讨论】:

    【解决方案2】:

    尝试类似:

    x = ['raz', 'dwa', 'raz', 'trzy', 'dwa', 'raz', 'trzy', 'cztery']
    wynik = {}
    for i in x:
        if i in wynik:
             wynik[i] += 1
        else:
             wynik[i] = 1
    print wynik
    
    {'cztery': 1, 'dwa': 2, 'raz': 3, 'trzy': 2}
    

    并且,如果您需要:

    import operator
    wynik_sorted = sorted(wynik.iteritems(), key=operator.itemgetter(1), reverse=True)
    
    print wynik_sorted
    [('raz', 3), ('dwa', 2), ('trzy', 2), ('cztery', 1)]
    

    【讨论】:

      【解决方案3】:

      countset 函数看起来在这里很有用。

      >>> l = ["i", "i", "am", "am", "am", "test"]
      >>> list(set([(a, l.count(a)) for a in l]))
      [('test', 1), ('i', 2), ('am', 3)]
      

      l.count() 提供列表中给定项目的出现次数。 set() 将列表转换为一个集合(一个不包含重复项的无序集合),然后list 将该集合转换回正确的类型。

      由于您正在处理Tag 对象,因此您可能需要使用某种方法来获取它们的字符串表示形式(尽管我在它们的接口上找不到文档)。也许是这样的:

      >>> l = [a.text for a in l]
      >>> list(set([(a, l.count(a)) for a in l]))
      

      【讨论】:

      • 其实我也想要模板内的标签对象(因为我在url template tag as above中使用它),所以我没有使用Tagobj的字符串表示
      • 对 - 我认为要使用这种方法,您必须计算字符串的重复次数而不是 Tag 对象。不过,在这样做之后,您可以将元组列表中的元素替换为 Tag 对象本身
      猜你喜欢
      • 2023-03-11
      • 2011-05-07
      • 2019-04-12
      • 2021-12-03
      • 2020-06-04
      • 2023-02-25
      • 2019-08-01
      • 2020-06-27
      • 1970-01-01
      相关资源
      最近更新 更多