我在《 Think Python》一书中尝试了chp 10.15,并编写了以下代码:
def turn_str_to_list(string):
res = []
for letter in string:
res.append(letter)
return res
def sort_and_unique (t):
t.sort()
for i in range (0, len(t)-2, 1):
for j in range (i+1, len(t)-1, 1):
if t[i]==t[j]:
del t[j]
return t
line=raw_input('>>>')
t=turn_str_to_list(line)
print t
print sort_and_unique(t)
我使用了双重“ for”结构来消除排序列表中的所有重复元素。但是,当我运行它时,我一直得到错误的输出。如果我输入'committee',则输出为['c','e','i','m','o','t','t'],这是错误的,因为它仍然包含双精度't '。我尝试了不同的输入,有时该程序无法接收列表中间的重复字母,并且始终无法接收到末尾的字母。我想念什么?谢谢你们。
您的程序之所以不能删除所有重复的字母,是因为del t[j]
在嵌套的for循环中使用会导致程序跳过字母。
我添加了一些印刷品以帮助说明这一点:
def sort_and_unique (t):
t.sort()
for i in range (0, len(t)-2, 1):
print "i: %d" % i
print t
for j in range (i+1, len(t)-1, 1):
print "\t%d %s len(t):%d" % (j, t[j], len(t))
if t[i]==t[j]:
print "\tdeleting %c" % t[j]
del t[j]
return t
输出:
>>>committee
['c', 'o', 'm', 'm', 'i', 't', 't', 'e', 'e']
i: 0
['c', 'e', 'e', 'i', 'm', 'm', 'o', 't', 't']
1 e len(t):9
2 e len(t):9
3 i len(t):9
4 m len(t):9
5 m len(t):9
6 o len(t):9
7 t len(t):9
i: 1
['c', 'e', 'e', 'i', 'm', 'm', 'o', 't', 't']
2 e len(t):9
deleting e
3 m len(t):8
4 m len(t):8
5 o len(t):8
6 t len(t):8
7 t len(t):8
i: 2
['c', 'e', 'i', 'm', 'm', 'o', 't', 't']
3 m len(t):8
4 m len(t):8
5 o len(t):8
6 t len(t):8
i: 3
['c', 'e', 'i', 'm', 'm', 'o', 't', 't']
4 m len(t):8
deleting m
5 t len(t):7
6 t len(t):7
i: 4
['c', 'e', 'i', 'm', 'o', 't', 't']
5 t len(t):7
i: 5
['c', 'e', 'i', 'm', 'o', 't', 't']
i: 6
['c', 'e', 'i', 'm', 'o', 't', 't']
['c', 'e', 'i', 'm', 'o', 't', 't']
无论何时del t[j]
调用,列表都会变小一个元素,但内部j变量for循环会不断进行迭代。
例如:
i=1, j=2, t = ['c', 'e', 'e', 'i', 'm', 'm', 'o', 't', 't']
看到t [1] == t [2](均为'e'),因此将t [2]删除。
现在 t = ['c', 'e', 'i', 'm', 'm', 'o', 't', 't']
但是,代码以i=1
,继续,j=3
将'e'与'm'进行比较,并跳过'i'。
最后,它没有捕获最后两个't'
s,因为到time时i=5
,len(t)
为7,因此内部for循环的条件range(6,6,1)
已执行且未执行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句