Python 对列表中的元素进行计数会产生意外结果

Python 对列表中的元素进行计数会产生意外结果,python,list,for-loop,count,Python,List,For Loop,Count,我试图数一数句子中每个字符的出现次数。我使用了下面的代码: printed = False sentence = "the quick brown fox jumps over the lazy dog" chars = list(sentence) count = 0 for char in chars: if char == ' ': chars.remove(char) if printed == False: count = cha

我试图数一数句子中每个字符的出现次数。我使用了下面的代码:

printed = False
sentence = "the quick brown fox jumps over the lazy dog"
chars = list(sentence)
count = 0
for char in chars:
    if char == ' ':
        chars.remove(char)
    if printed == False:    
        count = chars.count(char)
        print "char count: ", char, count
    else:
        printed = False  
问题是,每个单词的第一个字母(第一个单词除外)未打印,且计数不正确(每次新词开始时,计数从7开始递减1):

当我为循环创建2而不是1时,效果会更好:

sentence = "the quick brown fox jumps over the lazy dog"
chars = list(sentence)
count = 0
for char in chars:
    if char == ' ':
        chars.remove(char)
print chars
printed = False

for char in chars:
    if printed == False:
        count = chars.count(char)
        print "char count: ", char, count
        printed = True
    else:
        printed = False
以下是输出:

['t', 'h', 'e', 'q', 'u', 'i', 'c', 'k', 'b', 'r', 'o', 'w', 'n', 'f', 'o', 'x', 'j', 'u', 'm', 'p', 's', 'o', 'v', 'e', 'r', 't', 'h', 'e', 'l', 'a', 'z', 'y', 'd', 'o', 'g']
char count:  t 2
char count:  e 3
char count:  u 2
char count:  c 1
char count:  b 1
char count:  o 4
char count:  n 1
char count:  o 4
char count:  j 1
char count:  m 1
char count:  s 1
char count:  v 1
char count:  r 2
char count:  h 2
char count:  l 1
char count:  z 1
char count:  d 1
char count:  g 1
char count:  t 2
char count:  e 3
char count:  u 2
char count:  c 1
char count:  b 1
char count:  o 4
char count:  n 1
char count:  o 4
char count:  j 1
char count:  m 1
char count:  s 1
char count:  v 1
char count:  r 2
char count:  h 2
char count:  l 1
char count:  z 1
char count:  d 1
char count:  g 1
唯一的问题是,“o”字符在输出中出现两次。。。为什么呢? 另外,为什么1循环不起作用?

在列表的副本上迭代并使用elif,或者在删除后继续,您不想计算空白

printed = False
sentence = "the quick brown fox jumps over the lazy dog"
chars = list(sentence)

for char in chars[:]:
    if char == ' ':
        chars.remove(char)
        continue
    if not printed:
        count = chars.count(char)
        print "char count: ", char, count
        printed = True
    else:
        printed = False
您也可以在空格上拆分后直接
str.join

for char in "".join(sentence.split()):
    if not printed:
        count = chars.count(char)
        print "char count: ", char, count
        printed = True
    else:
        printed = False
但是,您自己的解决方案实际上都不能正常工作,即使复制了列表,输出中也缺少字母:

['t', 'h', 'e', 'q', 'u', 'i', 'c', 'k', 'b', 'r', 'o', 'w', 'n', 'f', 'o', 'x', 'j', 'u', 'm', 'p', 's', 'o', 'v', 'e', 'r', 't', 'h', 'e', 'l', 'a', 'z', 'y', 'd', 'o', 'g']
char count:  t 2
char count:  e 3
char count:  u 2
char count:  c 1
char count:  b 1
char count:  o 4
char count:  n 1
char count:  o 4
char count:  j 1
char count:  m 1
char count:  s 1
char count:  v 1
char count:  r 2
char count:  h 2
char count:  l 1
char count:  z 1
char count:  d 1
char count:  g 1
char count:  t 2
char count:  e 3
char count:  u 2
char count:  c 1
char count:  b 1
char count:  o 4
char count:  n 1
char count:  o 4
char count:  j 1
char count:  m 1
char count:  s 1
char count:  v 1
char count:  r 2
char count:  h 2
char count:  l 1
char count:  z 1
char count:  d 1
char count:  g 1
字符串中有26个唯一的字母,但输出~17个

您需要的是跟踪看到的字母,只打印一次计数,您的代码不记录打印的字符,只是随机设置一个标志:

sentence = "the quick brown fox jumps over the lazy dog"
chars = list(sentence)

printed = set()
for char in "".join(sentence.split()):
    if char not in printed:
        count = chars.count(char)
        print "char count: ", char, count
        printed.add(char)
或者,如果第一次看到的顺序无关紧要,则只需调用字符串上的集合:

for char in set("".join(sentence.split())):
    count = chars.count(char)
    print "char count: ", char, count
或者,如果您有大量数据,您最好使用:


您正在更改正在迭代的列表
char

l = range(10)

for i in l:
    l.remove(i)
    print i
其中:

0
2
4
6
8
您不应该修改正在迭代的列表。只需跳过您不想处理的元素:

for char in chars:
    if char == ' ':
        continue

    if printed == False:    
        ...     

问题的产生是因为在循环运行时删除了空格字符,这会中断迭代过程


只要在输入空格字符时不要做任何事情。

不要从正在迭代的列表中删除元素。此外:在您的示例中,变量
printed
总是
False
。@Martijn Pieters,dupe只回答了部分问题,无论您是复制列表还是not@PadraicCunningham:是的,但是剩下的问题可以通过使用
collections.Counter()
简单地解决。