Показать счет после удаления дубликатов

1

Не уверен, что я должен просто разбить базу данных для этого, но было бы интересно увидеть другое решение этой проблемы.

У меня есть несколько строк текста в текстовом файле, например...

Bill
Bill
Pete
Mary
Mary
Mary

Я не хотел дубликатов и добился этого так...

f = open('cgi/log/ipAddressList.log', 'r')
uniquelines = set(f.read().split("\n"))
for line in uniquelines:
    print line 

f.close()

Что дает мне...

Bill
Mary 
Pete

но теперь я хотел бы подсчитать, сколько экземпляров они появились в текстовом файле, например...

Bill (2)
Mary (3)
Pete (1)

Есть ли какая-нибудь магия питона, которая сделает это? Заранее спасибо.

Редактировать: Круто, я посмотрел в сборники и придумал,

f = open('cgi/log/ipAddressList.log', 'r')
c = collections.Counter( f.read().split("\n") )
uniquelines = set(c)

for line in uniquelines:
        print line + '%s (%d)' % (line, c[line])

f.close()

Просто заметил новый комментарий о readlines(), поэтому спасибо за это.

Здесь мое решение для словаря...

f = open('cgi/log/ipAddressList.log', 'r')
l = list( f.readlines() )
d = {}

for i in set(l):
    d[i] = l.count(i)

print d
  • 1
    Читайте о collections.defaultdict . Затем перепишите свой вопрос, чтобы включить любые вопросы по defaultdict .
Теги:
duplicates

2 ответа

3

collections.Counter может делать то, что вы ищете.

Пример:

>>> from collections import Counter
>>> lst = ['Bill', 'Bill', 'Pete', 'Mary', 'Pete']
>>> c = Counter(lst)
>>> c
Counter({'Pete': 2, 'Bill': 2, 'Mary': 1})
>>> for k,v in c.items():
...     print(k,v)
...
Pete 2
Bill 2
Mary 1

Вы можете применить это к своему делу с помощью:

Counter(f.read().split("\n"))
0

Когда вы думаете о подсчете в Python, вы (почти) все время должны думать о словарях. Вот возможное решение:

people = {}
for person in f:
    people[person] = people.get(person, 0) + 1
for person in people:
    print '%s (%d)' % person

Вероятно, вам это не понадобится, но лучше использовать f.readlines() вместо того, чтобы f.read().split("\n") на себя (f.read().split("\n")).

  • 0
    Спасибо, приятно знать;)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню