Не уверен, что я должен просто разбить базу данных для этого, но было бы интересно увидеть другое решение этой проблемы.
У меня есть несколько строк текста в текстовом файле, например...
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
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"))
Когда вы думаете о подсчете в 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")
).
collections.defaultdict
. Затем перепишите свой вопрос, чтобы включить любые вопросы поdefaultdict
.