2013-09-02 4 views
2

Так что это мой код:Как остановить «повторение» дважды в моей петле?

with open('cipher.txt') as f: 
    f = f.read().replace(' ', '') 

new = [] 
for i in f: 
    new = sorted([i + ' ' + str(f.count(i)) for i in f]) 
for o in new: 
    print(o) 

Это текстовый файл:

xli uymgo fvsar jsb 

Он должен получить каждую букву используется и распечатать их, прежде чем количество раз они используются, в алфавитном порядке , но я не хочу, чтобы это письмо (или любая буква, которая имеет .count() of 2) будет повторяться дважды, но я хочу, чтобы она повторялась один раз, как я могу это сделать?

Это то, что я получаю:

a 1 
b 1 
f 1 
g 1 
i 1 
j 1 
l 1 
m 1 
o 1 
r 1 
s 2 
s 2 
u 1 
v 1 
x 1 
y 1 

Но это то, что я хочу:

a 1 
b 1 
f 1 
g 1 
i 1 
j 1 
l 1 
m 1 
o 1 
r 1 
s 2 
u 1 
v 1 
x 1 
y 1 

ответ

1

Я хотел бы использовать collections.Counter для этого:

import collections 

s = 'xli uymgo fvsar jsb' 
cnt = collections.Counter(s.replace(' ', '')) 
for letter in sorted(cnt): 
    print (letter, cnt[letter]) 

Это распечатывает

a 1 
b 1 
f 1 
g 1 
i 1 
j 1 
l 1 
m 1 
o 1 
r 1 
s 2 
u 1 
v 1 
x 1 
y 1 
+0

Еще один момент: OP помечен как Python 3, но ваш оператор 'print' не будет работать на 3. –

+0

@MartijnPieters: Вы совершенно правы, спасибо. Исправлена. – NPE

1

Вы ищете collections.Counter() вместо:

from collections import Counter 

with open('cipher.txt') as f: 
    new = Counter(f.read().replace(' ', '')) 

for letter, count in new.most_common(): 
    print(letter, count) 

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

for letter in sorted(new): 
    print(letter, new[letter]) 

Counter.most_common() сортирует результаты по счетам, по убыванию. sorted(new), с другой стороны, возвращает отсортированный список ключей словаря Counter, так что версия более точно соответствует вашей попытке вывода.

Ваш код вместо этого используется f.count(i) для подсчета каждой буквы каждый раз, когда вы столкнулись с ней. Вы бы нормально использовать словарь для отслеживания подсчета и избежать использования полную проверку str.count():

counts = {} 
for letter in f: 
    counts[letter] = counts.get(letter, 0) + 1 

for letter in sorted(new): 
    print(letter, new[letter]) 
+0

Не думаю, что ОП хочет импортировать: http://stackoverflow.com/questions/18568309/sorting-results/18568345#18568345 – TerryA

+0

всего вещь для изменения будет делать 'sorted (new.keys())' и перебирать это, чтобы печатать в альфа-порядке. Может также хотеть отбросить знаки пунктуации, но вопрос OP не дает понять, будут ли они существовать. – sberry

+0

@sberry: Почему 'new.keys()' когда 'sorted (new)' хватает? Я уже редактировал эту часть, но самой большой проблемой было то, что OP использовал понимание списка, в котором был необходим словарь. –

1

Самый простой способ сделать это с collections.Counter:

from collections import Counter 

s = "xli uymgo fvsar jsb" 

for letter,count in Counter((i for i in s if i != ' ')).iteritems(): 
    print letter, count 

Чтобы решить вашу проблему, вы можете конвертировать список в набор или использовать defaultdict. Вот реализация defaultdict:

from collections import defaultdict 

d = defaultdict(int) 

for i in f: 
    d[i] += 1 

for k in sorted(d.keys()): 
    print k, d[k] 

defaultdict также реализации внешних удобно, если вы не можете использовать счетчик (его на 2.7+)

1

Для того, чтобы получить подсчет количества раз каждый символ появляется в текстовом файле, вы должны использовать следующий код:

from collections import Counter 

def get_char_count_from_file(file_path): 
    with open(file_path) as f: 
     return Counter(f.read())  

Пример:

>>> get_char_count_from_file('C:/Python27/README.txt') 
Counter({' ': 10634, 'e': 4067, 't': 3269, 'i': 2799, 'o': 2791, 'n': 2438, 's': 2307, 'a': 2283, 'r': 2183, 'l': 1848, 'h': 1469, 'u': 1278, '\n': 1229, 'd': 1225, 'c': 1196, '-': 1116, 'p': 969, 'm': 899, 'f': 846, 'y': 791, '.': 770, 'b': 697, 'g': 672, 'w': 488, ',': 408, '/': 326, 'k': 288, 'v': 286, 'T': 250, 'S': 223, 'P': 212, 'I': 198, 'C': 191, 'x': 177, '"': 176, ')': 176, '(': 162, '=': 125, ':': 119, 'O': 115, 'E': 108, 'D': 102, '2': 95, 'R': 95, 'A': 94, 'M': 94, '_': 89, 'N': 85, 'L': 84, "'": 84, '1': 78, 'X': 71, '0': 69, 'U': 65, 'G': 63, '4': 53, 'H': 53, 'B': 49, '3': 48, '+': 44, 'W': 42, 'F': 40, '5': 39, 'q': 36, 'Y': 35, '6': 31, 'z': 30, ';': 25, 'V': 22, 'j': 22, '8': 21, '9': 18, '$': 17, '@': 16, '7': 15, '<': 13, '>': 13, '\\': 11, '!': 11, '*': 10, '{': 8, '}': 8, 'K': 7, '`': 6, 'J': 6, '#': 5, 'Q': 5, '&': 4, '?': 3, 'Z': 3, '~': 3, '[': 2, '\t': 2, ']': 2}) 

Как вы можете использовать это:

>>> for k,v in sorted(Counter('xli uymgo fvsar jsb').items()): 
    print k, v 

    3 
a 1 
b 1 
f 1 
g 1 
i 1 
j 1 
l 1 
m 1 
o 1 
r 1 
s 2 
u 1 
v 1 
x 1 
y 1 
1
with open('cipher.txt') as f: 
    f = f.read().replace(' ', '') 

new = set() 
for i in f: 
    new = set(sorted([i + ' ' + str(f.count(i)) for i in f])) 
for o in new: 
print(o)