Как использовать dict в python? - PullRequest
0 голосов
/ 26 июня 2009
10
5
-1
-1
-1
1
1
0
2
...

Если я хочу посчитать количество вхождений каждого числа в файле, как мне использовать python для этого?

Ответы [ 9 ]

7 голосов
/ 26 июня 2009

Это почти тот же алгоритм, который описан в ответе Анурага Униял, за исключением использования файла в качестве итератора вместо readline():

from collections import defaultdict
try:
  from io import StringIO # 2.6+, 3.x
except ImportError:
  from StringIO import StringIO # 2.5

data = defaultdict(int)

#with open("filename", "r") as f: # if a real file
with StringIO("10\n5\n-1\n-1\n-1\n1\n1\n0\n2") as f:
  for line in f:
    data[int(line)] += 1

for number, count in data.iteritems():
  print number, "was found", count, "times"
5 голосов
/ 26 июня 2009

Счетчик - ваш лучший друг:)
http://docs.python.org/dev/library/collections.html#counter-objects

для (Python2.5 и 2.6) http://code.activestate.com/recipes/576611/

>>> cnt = Counter()
>>> for word in ['red', 'blue', 'red', 'green', 'blue', 'blue']:
...     cnt[word] += 1
>>> cnt
Counter({'blue': 3, 'red': 2, 'green': 1})
# or just cnt = Counter(['red', 'blue', 'red', 'green', 'blue', 'blue'])

для этого:

print Counter(int(line.strip()) for line in open("foo.txt", "rb"))
##output
Counter({-1: 3, 1: 2, 0: 1, 2: 1, 5: 1, 10: 1})
2 голосов
/ 29 июня 2009

Новое в Python 3.1:

from collections import Counter
with open("filename","r") as lines:
    print(Counter(lines))
2 голосов
/ 26 июня 2009

Я думаю, что в python вы называете карту словарем.
Вот несколько полезных ссылок о том, как его использовать: http://docs.python.org/tutorial/datastructures.html#dictionaries

Хорошее решение см. В ответе Стефана или Мэтью, но также уделите некоторое время, чтобы понять, что делает этот код: -)

2 голосов
/ 26 июня 2009

Считать строки файла в список l, например ::

l = [int(line) for line in open('filename','r')]

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

>>> l = [10,5,-1,-1,-1,1,1,0,2]
>>> d = dict((x,l.count(x)) for x in l)
>>> d[1]
2

РЕДАКТИРОВАТЬ : как справедливо указывает Мэтью, это вряд ли оптимально. Вот версия, использующая defaultdict:

from collections import defaultdict
d = defaultdict(int)
for line in open('filename','r'):
    d[int(line)] += 1
1 голос
/ 26 июня 2009

Используйте словарь, где каждая строка является ключом, а count является значением. Счетчик приращений для каждой строки, и если нет словарной записи для строки, инициализируйте ее с 1 в условии кроме - это должно работать с более старыми версиями Python.

def count_same_lines(fname):
    line_counts = {}
    for l in file(fname):
        l = l.rstrip()
        if l:
            try:
                line_counts[l] += 1
            except KeyError:
                line_counts[l] = 1
    print('cnt\ttxt')
    for k in line_counts.keys():
        print('%d\t%s' % (line_counts[k], k))
1 голос
/ 26 июня 2009
  1. Используйте collection.defaultdict, чтобы по умолчанию считается за что-либо ноль
  2. После этого цикла через строки в файле используя file.readline и конвертировать каждая строка до int
  3. счетчик приращений для каждого значения в ваш счет
  4. наконец-то перешли на использование для intV, считать в countDict.iteritems () и значения печати
0 голосов
/ 26 июня 2009

counter.py

#!/usr/bin/env python
import fileinput
from collections import defaultdict

frequencies = defaultdict(int)
for line in fileinput.input():
    frequencies[line.strip()] += 1

print frequencies

Пример:

$ perl -E'say 1*(rand() < 0.5) for (1..100)' | python counter.py
defaultdict(<type 'int'>, {'1': 52, '0': 48})
0 голосов
/ 26 июня 2009
l = [10,5,-1,-1,-1,1,1,0,2]
d = {}
for x in l:
  d[x] = (d[x] + 1) if (x in d) else 1

Для каждого отдельного значения в исходном списке будет указана клавиша d, а значениями d будет число вхождений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...