如何计算列表python中的元素重复,django

时间:2013-08-31 13:31:50

标签: python django list count django-taggit

我有一个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 occurences

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

修改

所以我得到了所需的答案 我将结果发送到模板,将结果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模板中的字典?

完成后我们可以更改上面的模板循环,如下所示

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

3 个答案:

答案 0 :(得分:6)

尝试使用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)]

答案 1 :(得分:1)

尝试类似:

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

答案 2 :(得分:0)

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