Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 关于列表迭代的问题_Python_Arrays - Fatal编程技术网

Python 关于列表迭代的问题

Python 关于列表迭代的问题,python,arrays,Python,Arrays,我尝试使用以下代码使用循环从字符串中删除一些特殊字符 def chk(arr): i=0 while i<len(arr): j=arr[i] if (ord(j)<65 or ord(j)>90) and (ord(j)<97 or ord(j)>122): if ord(j)==39: pass else:

我尝试使用以下代码使用循环从字符串中删除一些特殊字符

def chk(arr):
    i=0
    while i<len(arr):
        j=arr[i]
        if (ord(j)<65 or ord(j)>90) and (ord(j)<97 or ord(j)>122):
            if ord(j)==39:
                pass
            else:
                arr.remove(j)
        i+=1
st = "//wont won't"
arr=[]
arr[:0]=st
chk(arr)
print(arr)
def chk(arr):
i=0

虽然i您的循环无法正常工作,因为在向前迭代时删除一个元素会将所有下一个元素下移一个索引,因此每次都会跳过一个元素。删除后向后循环或递减索引将解决此问题

# Decrementing index after removing:
def chk(arr):
    i=0
    while i<len(arr):
        j=arr[i]
        if (ord(j)<65 or ord(j)>90) and (ord(j)<97 or ord(j)>122):
            if ord(j)==39:
                pass
            else:
                arr.remove(j)
                i-=1
        i+=1

# Looping backwards:
def chk(arr):
    i=len(arr) - 1
    while i >= 0:
        j=arr[i]
        if (ord(j)<65 or ord(j)>90) and (ord(j)<97 or ord(j)>122):
            if ord(j)==39:
                pass
            else:
                arr.remove(j)
        i-=1

# Looping backwards with a for loop:
def chk(arr):
    for i in range(len(arr) - 1, -1, -1):
        j = arr[i]
        if (ord(j)<65 or ord(j)>90) and (ord(j)<97 or ord(j)>122):
            if ord(j)==39:
                pass
            else:
                arr.remove(j)
#删除后递减索引:
def chk(arr):
i=0
当i=0时:
j=arr[i]
如果(作战需求文件(j)90)和(作战需求文件(j)122):
如果ord(j)==39:
通过
其他:
arr.remove(j)
i-=1
#使用for循环向后循环:
def chk(arr):
对于范围内的i(len(arr)-1,-1,-1):
j=arr[i]
如果(作战需求文件(j)90)和(作战需求文件(j)122):
如果ord(j)==39:
通过
其他:
arr.remove(j)

< /代码> 在迭代时修改一个列表通常会产生奇怪的结果,并且在上面,你的<代码>或 s和<代码>和 s看起来有点可疑,关于它们如何处理范围中间的字符;通过使用字符代码而不是实际字符来混淆所有内容是没有帮助的。我很确定你想要这样的东西:

>>> def chk(arr):
...     arr[:] = [c for c in arr if c.isalpha() or c == "'"]
... 
>>> st = "//wont won't"
>>> arr = list(st)
>>> chk(arr)
>>> print(arr)
['w', 'o', 'n', 't', 'w', 'o', 'n', "'", 't']

尽量不要在迭代列表时修改列表,或者至少有条件地更新索引。这也属于代码评审SE的更多内容。@LukeSawczak代码评审用于评审工作代码。