python-3.x 代码仅在删除奇数或偶数索引项时有效

83qze16e  于 2023-01-14  发布在  Python
关注(0)|答案(4)|浏览(123)

问:编写一个Python程序,删除给定字符串中索引值为奇数或偶数的字符。
1.我试着用深度复制法复制一份名单。
1.我从第一个列表运行了一个循环,检查了是否存在,然后在第二个列表上使用pop方法从第二个列表中删除了该特定索引。
这段代码适用于某些输入,我认为主要是那些没有任何重复字符的输入,对其他输入不起作用。
代码

#!/usr/bin/python3
import copy
list1 = input("Enter a string ")
list1 = list(list1)
list2 = copy.deepcopy(list1)
for i in list1:
    if list1.index(i)%2 != 0:
        list2.pop(list2.index(i))
print(list2)

某些示例的输出为:

123456789 -> ['1', '3', '5', '7', '9'],   qwertyuiop -> ['q', 'e', 't', 'u', 'o'],   saurav -> ['s', 'u'],   11112222333344445555 -> ['1', '1', '1', '1', '2', '2', '2', '2', '3', '3', '3', '3', '4', '4', '4', '4', '5', '5', '5', '5']
xe55xuns

xe55xuns1#

阅读index的文档。它返回给定值第一次出现的索引。循环中的一个简单的print将向您显示正在进行的操作,并提供适当的细节。这是您在任何语言中编程时都需要学习的基本调试技能。

import copy
list1 = input("Enter a string ")
list1 = list(list1)
list2 = copy.deepcopy(list1)
for i in list1:
    if list1.index(i)%2 != 0:
        print(i, list1.index(i), list2.index(i))
        list2.pop(list2.index(i))
        print(list2)
print(list2)

输出:

Enter a string google
o 1 1
['g', 'o', 'g', 'l', 'e']
o 1 1
['g', 'g', 'l', 'e']
e 5 3
['g', 'g', 'l']
['g', 'g', 'l']

......这就是你的问题。修正你的逻辑。你已经"知道"需要保存或删除的索引。不需要提取字符,然后再次搜索它。你已经知道它在哪里了。
更好的是,只需将原始字符串切片为所需的字符:

print(list1[::2])
aurhwmvo

aurhwmvo2#

您的问题是list.index函数。The documentation声明它“返回值等于x的第一个项的列表中从零开始的索引”。因为您在list1上调用它-并且没有修改-结果将始终是list1.index('a') == 1
正确的解决方案是使用enumerate。这里还存在另一个问题-因为您正在从一个未修改的数组中创建索引,所以在第一次list.pop操作后,索引将关闭。删除项之后的每个项都将移位1。要更正此问题,您可以尝试构建一个list,而不是清空一个项:

#!/usr/bin/python3
list1 = input("Enter a string ")
list2 = []
for i, item in enumerate(list1):
    if i % 2 == 0:
        list2.append(item)
print(list2)
a8jjtwal

a8jjtwal3#

你根本不需要迭代,直接引用字符串元素就行了。

st="123456789"
print('Odd: ', list(st[::2]))
print('Even: ', list(st[1::2]))

输出:

Odd:  ['1', '3', '5', '7', '9']
Even:  ['2', '4', '6', '8']
xqnpmsa8

xqnpmsa84#

方法list.index(i)返回值等于i第一项列表中的索引。
例如,"saurav".index('a')返回1。当您调用list2.pop(list2.index(i))并希望弹出一个a时,它不能很好地工作。
我认为使用range作为内置函数会很简单。

list1 = list(input("Enter a string "))
list2 = list()
for i in range(len(list1)):
    if i % 2 == 0:
        list2.append(list1[i])
print(list2)

其工作方式相同,如下所示:

list1 = list(input("Enter a string "))
list2 = list()
for i in range(0, len(list1), 2):
    list2.append(list1[i])
print(list2)

此外,您可以在Python 2.3或更高版本中使用Extended Slices

list1 = list(input("Enter a string "))
list2 = list1[::2]
print(list2)

相关问题