我在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’结构来消除排序列表中的任何重复元素.
但是,当我运行它时,我一直得到错误的输出.
如果我输入“委员会”,输出是[‘c’,’e’,’i’,’m’,’o’,’t’,’t’],这是错误的,因为它仍然包含双’t’ ”.
我尝试了不同的输入,有时程序无法在列表中间拾取重复的字母,并且总是无法在最后拾取那些字母.
我错过了什么?多谢你们.
解决方法:
你的程序没有删除所有重复字母的原因是因为在嵌套的for循环中使用del t [j]会导致程序跳过字母.
我添加了一些打印来帮助说明这一点:
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’,因为在时间i = 5时,len(t)是7,因此内部for循环的条件是范围(6,6,1)并且不执行.
标签:python,list 来源: https://codeday.me/bug/20190722/1506697.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。