鱼C论坛

 找回密码
 立即注册
查看: 54|回复: 7

[已解决]列表内置方法的问题

[复制链接]
发表于 前天 11:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#判断传入的字符串参数是否为“回文联”
#回文联即用回文形式写成的对联
#例如:上海自来水来自海上
def huiwen(string):
    list1 = list(string)
    list2 = list(string).reverse()
    if list1 == list2:
        return 'shi1'
    else:
        return 'bushi'
print(huiwen('123454321'))

这个是错误的但是我不知道哪里错了

在IDLE中
ist1 = list('12321')

list2 = list1.reverse
list2
<built-in method reverse of list object at 0x0000021974259800>
返回值是这样的不管我用 print 还是 list都是返回错误值


ist1 = list('12321')
list2 = list1.reverse
list(list2)
Traceback (most recent call last):
  File "<pyshell#29>", line 1, in <module>
    list(list2)
TypeError: 'builtin_function_or_method' object is not iterable
print(list2)
<built-in method reverse of list object at 0x0000021974259800>
这里是完整过程求解,,,
最佳答案
前天 15:00
qasa 发表于 2025-08-28 14:59
FishC 发表于 2025-8-28 14:29
您好!我来为您详细解 ...


您好!您的问题非常好,这确实是理解这段代码的关键。

是的,您的理解完全正确:

last = length - 1 这个操作完全是建立在 length = len(string) 的基础之上的。

让我为您详细解释一下:

字符串的索引是从 0 开始的,所以:
- 第一个字符的索引是 0
- 第二个字符的索引是 1
- ...
- 最后一个字符的索引是 长度 - 1

举个例子:
string = "abcde"
length = len(string)  # 结果是 5
last_index = length - 1  # 结果是 4

验证一下:
string[0] = 'a'
string[1] = 'b'
string[2] = 'c'
string[3] = 'd'
string[4] = 'e'  # 确实是最后一个字符

所以这个前提条件非常重要:
  • 必须先有 length = len(string)
  • 然后才能计算 last = length - 1


如果没有 length = len(string) 这个前提,last = length - 1 就毫无意义,因为 length 变量还没有被定义。

在回文判断的算法中,我们需要同时从字符串的开头和结尾向中间比较字符:

  1. # 比较第一个字符和最后一个字符:string[0] vs string[last]
  2. # 比较第二个字符和倒数第二个字符:string[1] vs string[last-1]
  3. # 以此类推...
复制代码


希望这个解释能帮助您更好地理解这段代码的逻辑!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 前天 11:36 | 显示全部楼层
您好!您的问题出在对 reverse() 方法的理解上。让我来详细解释一下:

list.reverse() 是一个原地操作的方法,它会直接修改原列表,并且返回值为 None。所以当您写 list2 = list1.reverse() 时,实际上 list2 被赋值为 None,而不是反转后的列表。

以下是修正后的代码:

  1. def huiwen(string):
  2.     list1 = list(string)
  3.     list2 = list1[::-1]  # 使用切片创建反转后的副本
  4.     if list1 == list2:
  5.         return '是回文联'
  6.     else:
  7.         return '不是回文联'

  8. print(huiwen('123454321'))
复制代码


主要修改点:
1. 使用切片 [::-1] 来创建反转列表的副本
2. 这样就不会修改原列表,同时能得到正确的比较结果

您在 IDLE 中遇到的错误是因为:
list1.reverse 是一个方法对象,不是列表,所以不能直接转换为列表或打印。

希望这个解释能帮到您!如果还有其他问题,请随时提出。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

 楼主| 发表于 前天 11:42 | 显示全部楼层
FishC 发表于 2025-8-28 11:36
您好!您的问题出在对 reverse() 方法的理解上。让我来详细解释一下:

list.reverse() 是一个原地操作的 ...

666666666666666666666666
那我想请问   reversed()    这个BIF可以用吗
例如
list1 ='123454321'
list2 =reversed(list1)
if list1 == list(list2):
        return '111'
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 11:42 | 显示全部楼层
qasa 发表于 2025-08-28 11:42
FishC 发表于 2025-8-28 11:36
您好!您的问题出在对 ...


您的问题非常好!`reversed()` 确实可以用,而且是一个很好的解决方案。不过您需要注意一个重要的细节:

`reversed()` 函数返回的是一个迭代器(iterator),而不是列表。所以您需要将其转换为列表才能进行比较。

以下是使用 `reversed()` 的正确写法:

  1. def huiwen(string):
  2.     list1 = list(string)
  3.     list2 = list(reversed(list1))  # 将迭代器转换为列表
  4.     if list1 == list2:
  5.         return '是回文联'
  6.     else:
  7.         return '不是回文联'

  8. print(huiwen('123454321'))
复制代码


您提供的代码思路是正确的,只是需要将 `reversed(list1)` 用 `list()` 包装一下。

实际上,对于字符串的回文判断,还有更简洁的写法:

  1. def huiwen(string):
  2.     return string == string[::-1]
复制代码


这个写法利用了字符串的切片操作 string[::-1] 来直接反转字符串,更加简洁高效。

希望这个解释对您有帮助!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 前天 14:28 | 显示全部楼层
FishC 发表于 2025-8-28 11:42
您的问题非常好!`reversed()` 确实可以用,而且是一个很好的解决方案。不过您需要注意一个重要的细节 ...

请您解析
def palindrome(string):
    length = len(string)
    last = length-1
    length //= 2
    flag = 1
    for each in range(length):
        if string[each] != string[last]:
            flag = 0
        last -= 1
    if flag == 1:
        return 1
    else:
        return 0
string = input('请输入一句话:')
if palindrome(string) == 1:
    print('是回文联!')
else:
    print('不是回文联!')

这里
def palindrome(string):
    length = len(string)
    last = length-1
    length //= 2
    flag = 1
我不是很能理解
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 14:29 | 显示全部楼层
qasa 发表于 2025-08-28 14:28
FishC 发表于 2025-8-28 11:42
您的问题非常好!`rev ...


您好!我来为您详细解析这段代码。这段代码的目的是通过逐个字符比较来判断字符串是否为回文。

首先,让我们分析代码中的问题:

def palindrome(string):
    length = len(string)  # 获取字符串长度
    last = length-1       # 获取最后一个字符的索引
    length //= 2          # 计算需要比较的次数(长度的一半)
    flag = 1              # 设置标志位,初始为1表示是回文
    for each in range(length):
        if string != string:  # 这里有问题!应该是比较对应位置的字符
            flag = 0
        last -= 1
    if flag == 1:
        return 1
    else:
        return 0

这段代码有几个关键问题:
1. 在比较字符时,应该使用索引:string[each] != string[last]
2. last的递减应该在if语句之后,否则会影响比较结果

修正后的代码应该是这样的:

def palindrome(string):
    length = len(string)
    last = length - 1
    compare_times = length // 2  # 需要比较的次数
    flag = 1
   
    for i in range(compare_times):
        if string[i] != string[last]:  # 比较对应位置的字符
            flag = 0
            break  # 发现不匹配就可以提前结束
        last -= 1  # 移动末尾指针
   
    return flag  # 可以直接返回flag,不需要再次判断

让我解释一下这个算法的思路:

1. length = len(string) - 获取字符串长度
2. last = length - 1 - 获取最后一个字符的索引(从0开始计数)
3. compare_times = length // 2 - 计算需要比较的次数(只需比较前半部分和后半部分)
4. flag = 1 - 设置标志位,初始假设是回文
5. 循环中比较 string[i] 和 string[last]:
   - 如果不同,设置 flag=0 并跳出循环
   - 如果相同,继续比较下一对字符
6. 最后返回 flag 的值

例如对于字符串 "abcba":
- 比较 string[0]('a') 和 string[4]('a')
- 比较 string[1]('b') 和 string[3]('b')
- 中间字符 'c' 不需要比较

这种方法的优点是只需要比较一半的字符,效率较高。希望这个解释对您有帮助!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 前天 14:59 | 显示全部楼层
FishC 发表于 2025-8-28 14:29
您好!我来为您详细解析这段代码。这段代码的目的是通过逐个字符比较来判断字符串是否为回文。

首先 ...

last = length-1       # 获取最后一个字符的索引
是建立在 length =len(string) 的上面吗还是说就是这么理解的没有前提条件
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 15:00 | 显示全部楼层    本楼为最佳答案   
qasa 发表于 2025-08-28 14:59
FishC 发表于 2025-8-28 14:29
您好!我来为您详细解 ...


您好!您的问题非常好,这确实是理解这段代码的关键。

是的,您的理解完全正确:

last = length - 1 这个操作完全是建立在 length = len(string) 的基础之上的。

让我为您详细解释一下:

字符串的索引是从 0 开始的,所以:
- 第一个字符的索引是 0
- 第二个字符的索引是 1
- ...
- 最后一个字符的索引是 长度 - 1

举个例子:
string = "abcde"
length = len(string)  # 结果是 5
last_index = length - 1  # 结果是 4

验证一下:
string[0] = 'a'
string[1] = 'b'
string[2] = 'c'
string[3] = 'd'
string[4] = 'e'  # 确实是最后一个字符

所以这个前提条件非常重要:
  • 必须先有 length = len(string)
  • 然后才能计算 last = length - 1


如果没有 length = len(string) 这个前提,last = length - 1 就毫无意义,因为 length 变量还没有被定义。

在回文判断的算法中,我们需要同时从字符串的开头和结尾向中间比较字符:

  1. # 比较第一个字符和最后一个字符:string[0] vs string[last]
  2. # 比较第二个字符和倒数第二个字符:string[1] vs string[last-1]
  3. # 以此类推...
复制代码


希望这个解释能帮助您更好地理解这段代码的逻辑!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-8-30 11:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表