6

我有一个列表列表。我想从它们中删除前导和尾随空格。该strip()方法返回没有前导和尾随空格的字符串副本。单独调用该方法不会进行更改。通过这个实现,我得到了一个'array index out of bounds error'. 在我看来,对于列表中的每个列表 (0-len(networks)-1) 和每个字符串 (0-len(networks[x]) aka i 和 j 应该完全映射到合法的索引而不是越界?

i = 0
j = 0
for x in networks:
    for y in x:
    networks[i][j] = y.strip()
        j = j + 1
     i = i + 1
4

6 回答 6

14

j遍历第一个列表后,您忘记重置为零。

这是您通常不在 Python 中使用显式迭代的原因之一 - 让 Python 为您处理迭代:

>>> networks = [["  kjhk  ", "kjhk  "], ["kjhkj   ", "   jkh"]]
>>> result = [[s.strip() for s in inner] for inner in networks]
>>> result
[['kjhk', 'kjhk'], ['kjhkj', 'jkh']]
于 2012-10-25T14:43:46.293 回答
5

这会生成一个新列表:

>>> x = ['a', 'b ', ' c  ']
>>> map(str.strip, x)
['a', 'b', 'c']
>>> 

string编辑:当您使用内置类型 ( ) 时无需导入str

于 2012-10-25T14:42:18.933 回答
5

您不需要计算i, j自己,只需枚举,看起来您也没有递增i,因为它不在循环中并且j不在最内循环中,这就是您有错误的原因

for x in networks:
    for i, y in enumerate(x):
        x[i] = y.strip()

另请注意,您不需要访问网络,但访问“x”并替换值会起作用,因为 x 已经指向networks[index]

于 2012-10-25T14:44:37.820 回答
3

所以你有类似的东西:[['a ', 'b', ' c'], [' d', 'e ']],你想生成[['a', 'b',' c'], ['d', 'e']]. 你可以这样做:

mylist = [['a ', 'b', ' c'], ['  d', 'e  ']]
mylist = [[x.strip() for x in y] for y in mylist]

通常不需要在列表中使用索引,并且在迭代时更改列表,尽管它可能会产生多种不良副作用。

于 2012-10-25T14:51:21.647 回答
0
c=[]
for i in networks:
    d=[]
    for v in i:
         d.append(v.strip())
    c.append(d)
于 2012-10-26T06:29:06.423 回答
0

可以使用递归来实现更简洁的清理列表版本。这将允许您在列表中拥有无限数量的列表,同时保持代码的非常低的复杂性。

旁注:这也进行了安全检查,以避免条带出现数据类型问题。这允许您的列表包含整数、浮点数等。

    def clean_list(list_item):
        if isinstance(list_item, list):
            for index in range(len(list_item)):
                if isinstance(list_item[index], list):
                    list_item[index] = clean_list(list_item[index])
                if not isinstance(list_item[index], (int, tuple, float, list)):
                    list_item[index] = list_item[index].strip()

        return list_item

然后只需使用您的列表调用该函数。所有值都将在列表列表中被清除。

clean_list(网络)

于 2017-07-05T15:14:36.150 回答