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()
简单地解决。