久远的心宿三 发表于 2020-10-8 19:46:55

求问大佬,这个python程序逻辑哪里有问题?

f1 = ['四月的阳光明显比三月要多一些\n']
f2 = ['四月的阳1明显比2月要多3些\n']

num = 0

for i in f1:
    for j in f2:
      if i != j:
            num += 1
            break
      else:
            break

print('共有 %d 出不同' % (num))


我想实现的是比较俩列表中第一个元素的每一个字符是否相同,不同的话计数+1,但是为啥运行完后输出的结果是每一个字符不一样,输出了14处不同。。。明明只有3处不同啊
请问代码逻辑哪里有问题啊?

昨非 发表于 2020-10-8 19:50:20

因为你这个代码外层遍历一个字符,内层遍历了一遍,输出自然是十四

昨非 发表于 2020-10-8 19:54:13

本帖最后由 昨非 于 2020-10-8 19:56 编辑

f1 = '四月的阳光明显比三月要多一些\n'
f2 = '四月的阳1明显比2月要多3些\n'

num = 0

for i in range(len(f1)):
    if f1 != f2:
      num += 1
print('共有 %d 出不同' % (num))


差别比较关键在于索引值相同,像你那样f1第一个字符依次跟f2的所有字符比较得到的计数自然是不对的
而且只有一个字符串没必要放在列表里,放在外面一样地还省去了索引的麻烦

久远的心宿三 发表于 2020-10-8 20:23:32

昨非 发表于 2020-10-8 19:54
差别比较关键在于索引值相同,像你那样f1第一个字符依次跟f2的所有字符比较得到的计数自然是不对的
而 ...

大哥,我这个程序是不是只会让f1中的每一个字符只与f2中的第1个字符做对比??
运行逻辑是不是这样:外层for先从f1中拿出第一个字符,然后内层for从f2中拿出第一个字符,继续对比是否相同,对比完成后内层for循环因为break跳出循环了,然后集继续运行外层for循环,此时外层for拿出f1的第二个字符,接下来应该是我搞错的地方,即此时内层for依旧拿出的是f2中的第一个字符,并不会因为前面拿过了第一个字符而去拿第二个字符,接着也就是f1中的第二个字符和f2中的第一个字符对比。。以此类推只会让f1中的每一个字符只与f2中的第1个字符做对比,然后输出。
这个逻辑对吗??

昨非 发表于 2020-10-8 20:31:56

本帖最后由 昨非 于 2020-10-8 20:49 编辑

久远的心宿三 发表于 2020-10-8 20:23
大哥,我这个程序是不是只会让f1中的每一个字符只与f2中的第1个字符做对比??
运行逻辑是不是这 ...

外层循环取一个,有内层多个比较,你这个break虽然在第一次外循环时满足条件,
但当f1取到第二个字符(及其后的所有字符)时,再与f2第一个字符去比,计数当然会错

久远的心宿三 发表于 2020-10-8 20:54:06

昨非 发表于 2020-10-8 20:31
外层循环取一个,有内层多个比较,你这个break虽然在第一次外循环时满足条件,
但当f1取到第二个字符 ...

也就是说用break跳出一个for循环的话,接下来因为其他条件,再次运行这个for循环的话依旧是从头开始循环,而不是从上次break跳出的那个点继续往下循环是吧?我是这里理解错了。。以为break后再次运行能接着上次循环呢
页: [1]
查看完整版本: 求问大佬,这个python程序逻辑哪里有问题?