冷冻哈密瓜 发表于 2023-4-18 18:56:31

zuoye

s = input("请输入一个字符串:")
   
res = []
for each in s:
    if res and res[-1].lower() == each.lower() and res[-1] != each:
      res.pop()
    else:
      res.append(each)
   
for each in res:
    print(each, end='')

大佬解释一下吧,救救孩子!

歌者文明清理员 发表于 2023-4-18 18:57:10

本帖最后由 歌者文明清理员 于 2023-4-18 19:02 编辑

这段代码是一个简单的字符串去重算法,它能够去除相邻且大小写不同的重复字符。具体来说,假设输入的字符串为 s,首先定义一个空列表 res 用于存储输出结果。然后遍历字符串 s 中的每一个字符 each,如果字符 each 和列表 res 中的最后一个字符相同(经过小写转换),但又不是同一个字符,则删除列表 res 中的最后一个字符;否则将该字符添加到列表 res 中。这样遍历完字符串 s 后,列表 res 中就得到了去重后的字符序列。

最后通过 for 循环遍历输出列表 res 中的每个元素,实现去重后的字符串输出。注意这里为了避免输出时出现换行符,使用了 end='' 参数。
例如:
当输入字符串 s 为 "illioveefisschch" 时,代码的具体运算过程如下所示:

1. 定义空列表 res,初始值为 []
2. 遍历字符串 s,依次取出每个字符
a. 当遍历到第一个字符 'i' 时,因为 res 列表为空,直接将其添加进去:
res = ['i']

b. 继续遍历到下一个字符 'l',与 res 中的最后一个 'i' 不相同,直接将其添加进 res:
res = ['i', 'l']

c. 遍历到字符 'l' 和字符 'i' 相同且大小写不一致,此时需要把 res 最后一个字符 'l' 删除:
res = ['i']

d. 遍历到字符 'o',直接添加进 res:
res = ['i', 'o']

e. 遍历到字符 'v',直接添加进 res:
res = ['i', 'o', 'v']

f. 遍历到字符 'e',直接添加进 res:
res = ['i', 'o', 'v', 'e']

g. 遍历到字符 'e',与 res 中的最后一个字符 'e' 大小写相同,直接跳过
res = ['i', 'o', 'v', 'e']

h. 遍历到字符 'f',直接添加进 res
res = ['i', 'o', 'v', 'e', 'f']

i. 遍历到字符 'i' 和最后一个字符 'f' 大小写相同,但不相等,删除 res 中最后一个字符 'f'
res = ['i', 'o', 'v', 'e']

j. 遍历到字符 's',直接添加进 res
res = ['i', 'o', 'v', 'e', 's']

k. 遍历到字符 'c',直接添加进 res
res = ['i', 'o', 'v', 'e', 's', 'c']

l. 遍历到字符 'h',与 res 中的最后一个字符 'c' 不相同,直接添加进 res
res = ['i', 'o', 'v', 'e', 's', 'c', 'h']

m. 遍历到字符 'c' 和最后一个字符 'h' 大小写相同,但不相等,删除 res 中最后一个字符 'h'
res = ['i', 'o', 'v', 'e', 's', 'c']

n. 遍历完 s 字符串后,res 中剩下的元素即为去重后的字符串,将其输出:

输出结果为 "iovesc"
因此,输入为 "illioveefisschch" 时,运行该程序的输出结果为 "iovesc"。

isdkz 发表于 2023-4-18 18:59:29

这段代码的功能是移除给定字符串中相邻的大小写字母对。如果一个大写字母和相邻的小写字母相同,或者一个小写字母和相邻的大写字母相同,那么它们将被移除。

让我们一步步解释这段代码:


[*]s = input("请输入一个字符串:"):从用户获取一个字符串并将其赋值给变量 s。

[*]res = []:创建一个空列表 res,用于存储处理后的字符。

[*]for each in s::遍历输入字符串中的每个字符。

[*]if res and res[-1].lower() == each.lower() and res[-1] != each::条件判断,用于检查当前字符 each 和上一个字符 res[-1] 是否相同但大小写不同。

[*]res and res[-1]:确保 res 列表不为空,因为我们要比较 res 中的最后一个元素。
[*]res[-1].lower() == each.lower():将两个字符转换为小写,如果它们相同,则条件成立。
[*]res[-1] != each:检查两个字符是否不同(即一个大写,一个小写)。


[*]如果条件成立(即找到大小写不同的相邻字符对),res.pop() 将从 res 列表中删除最后一个字符。

[*]否则,使用 res.append(each) 将当前字符 each 添加到 res 列表中。

[*]最后,使用 for each in res: 和 print(each, end='') 依次打印 res 列表中的每个字符,不换行。


这是一个简单的示例,帮助你理解代码:

输入:s = "aAbBcCdDeEfF"
输出:空字符串

在这个例子中,大小写相邻字符对被逐一移除。

歌者文明清理员 发表于 2023-4-18 19:10:54

isdkz 发表于 2023-4-18 18:59
这段代码的功能是移除给定字符串中相邻的大小写字母对。如果一个大写字母和相邻的小写字母相同,或者一个小 ...

你是怎么做到的

isdkz 发表于 2023-4-18 19:11:47

歌者文明清理员 发表于 2023-4-18 19:10
你是怎么做到的

做到什么?

歌者文明清理员 发表于 2023-4-18 19:24:46

isdkz 发表于 2023-4-18 19:11
做到什么?

序号

isdkz 发表于 2023-4-18 19:28:56

歌者文明清理员 发表于 2023-4-18 19:24
序号

高级模式有一个列表

歌者文明清理员 发表于 2023-4-18 19:35:28

isdkz 发表于 2023-4-18 19:28
高级模式有一个列表

对啊,怎么添加序号?

test

twice

isdkz 发表于 2023-4-18 19:36:18

歌者文明清理员 发表于 2023-4-18 19:35
对啊,怎么添加序号?

test


就用那个列表就自己有序号了呀

歌者文明清理员 发表于 2023-4-18 19:37:32

isdkz 发表于 2023-4-18 19:36
就用那个列表就自己有序号了呀


淡定

不淡定


淡定

不淡定

我没有

isdkz 发表于 2023-4-18 19:38:22

歌者文明清理员 发表于 2023-4-18 19:37
淡定

不淡定



[*]淡定

[*]不淡定

歌者文明清理员 发表于 2023-4-18 19:39:02

isdkz 发表于 2023-4-18 19:38


手动添加星号?

[*]阿呸

[*]vb


得选中在点

isdkz 发表于 2023-4-18 19:40:04

歌者文明清理员 发表于 2023-4-18 19:39
手动添加星号?

[*]阿呸


就是选中点的呀

歌者文明清理员 发表于 2023-4-18 19:44:18

isdkz 发表于 2023-4-18 19:40
就是选中点的呀

谢谢

歌者文明清理员 发表于 2023-4-18 20:21:48

为什么不是我???

冷冻哈密瓜 发表于 2023-4-18 20:28:53

歌者文明清理员 发表于 2023-4-18 20:21
为什么不是我???

不好意思,他回复比较快

冷冻哈密瓜 发表于 2023-4-18 20:40:08

歌者文明清理员 发表于 2023-4-18 18:57
这段代码是一个简单的字符串去重算法,它能够去除相邻且大小写不同的重复字符。具体来说,假设输入的字符 ...

怎么感觉最后举例子输出结果不对劲呀,而且遍历过程中删除f那里很懵逼,字符 'i' 和最后一个字符 'f' 大小写相同,但不相等,删除,那其他的不都大小写相同,但不相等,并且这是大小写去重。illioveefisschch里只有小写呀

歌者文明清理员 发表于 2023-4-18 20:41:58

冷冻哈密瓜 发表于 2023-4-18 20:40
怎么感觉最后举例子输出结果不对劲呀,而且遍历过程中删除f那里很懵逼,字符 'i' 和最后一个字符 'f' 大 ...

要问得问chatgpt

冷冻哈密瓜 发表于 2023-4-18 20:43:05

页: [1]
查看完整版本: zuoye