Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何停止';s';在我的循环中再发生两次?_Python_Python 3.x - Fatal编程技术网

Python 如何停止';s';在我的循环中再发生两次?

Python 如何停止';s';在我的循环中再发生两次?,python,python-3.x,Python,Python 3.x,这是我的代码: 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 它应该让每个字母在使用之前按字母顺序打印出来,但我不希望字母“s”(或任何.count()为

这是我的代码:

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
它应该让每个字母在使用之前按字母顺序打印出来,但我不希望字母“s”(或任何.count()为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
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
您正在寻找的是:

或者,也可以按排序顺序打印字母:

for letter in sorted(new):
   print(letter, new[letter])
按计数按降序对结果排序
sorted(new)
另一方面,返回
计数器
字典键的排序列表,以便版本更接近您尝试的输出

您的代码使用
f.count(i)
来计算每次遇到的每个字母。您通常会使用字典来跟踪计数,并避免使用
str.count()的完整扫描。


执行此操作的简单方法是使用
集合。计数器

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]

如果您无法使用计数器(适用于2.7+)

为了获得每个字符在文本文件中出现的次数,您应该使用以下代码,则defaultdict实现也很方便:

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})
我会用这个:

import collections

s = 'xli uymgo fvsar jsb'
cnt = collections.Counter(s.replace(' ', ''))
for letter in sorted(cnt):
  print (letter, cnt[letter])
这是打印出来的


不要认为OP想要导入:唯一需要更改的是执行
排序(new.keys())
并迭代以按alpha顺序打印。可能还想丢弃标点符号,但OP的问题并不能明确它们是否存在。@sberry:Why
new.keys()
when
sorted(new)
就足够了?我已经在中编辑了该部分,但最大的问题是OP在需要字典的地方使用了列表理解。没错,您不需要调用键,但我认为OP可能会忽略这样一个事实:迭代字典会迭代键。另一点:OP将其标记为Python 3,但是你的
print
语句在3上不起作用。
>>> 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
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
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)