从每个子列表中删除特定位置的元素

Ric*_*ard 2 python list-comprehension list

我有一个列表,如:

a = [[1,'b',2],[3,':',4],[5,':',6]]
Run Code Online (Sandbox Code Playgroud)

我想删除'b'和':'字符,以便我最终得到:

[[1,2],[3,4],[5,6]]
Run Code Online (Sandbox Code Playgroud)

(请注意,这些字符位于每个子列表的第二个位置这一事实只是我选择的一个例子 - 我正在处理的真实数据集在随机位置具有相同的字符).

我选择使用列表理解来做到这一点.以下是迭代子列表中每个项目的代码示例:

for list in a:
    for number in list:
        print number
Run Code Online (Sandbox Code Playgroud)

但是当我实现我的列表理解而不是像这样的print语句时:

b = []

for list in a:
    for number in list:
        b = [number for number in list if number != 'b' and number != ':']
        print b
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

[1, 2]
[1, 2]
[1, 2]
[3, 4]
[3, 4]
[3, 4]
[5, 6]
[5, 6]
[5, 6]
Run Code Online (Sandbox Code Playgroud)

我的问题是,为什么每个子列表有三个副本?我在期待

[1,2]
[3,4]
[5,6]
Run Code Online (Sandbox Code Playgroud)

任何帮助和/或指导将不胜感激.

干杯.

cs9*_*s95 5

如果你要删除的是b:,你可以使用嵌套列表理解和集合成员资格测试:

a_new = [[y for y in x if y not in {'b', ':'}] for x in a]
Run Code Online (Sandbox Code Playgroud)

虽然,如果您想将其概括为删除任何非数字元素,请使用isinstance检查进行过滤:

import numbers
a_new = [[y for y in x if isinstance(y, numbers.Number)] for x in a]
Run Code Online (Sandbox Code Playgroud)

请注意,这与以下内容相同:

a_new = []
for i in a:
    a_new.append([])
    for j in i:
        if isinstance(j, numbers.Number):
            a_new[-1].append(j)
Run Code Online (Sandbox Code Playgroud)

请注意,这里只需要2个循环(您的代码有3个,这就是为什么所有内容都被复制3次 - 每个内部列表中的项目数!).

print(a_new)
[[1, 2], [3, 4], [5, 6]]
Run Code Online (Sandbox Code Playgroud)

这里的另一个注意事项numbers.Number是注入任何数值的超类(包括无理值).如果您的用例不包含复数,您可能希望使用numbers.Rationalnumbers.Real.

最后的注释,如这里提到的,请不要使用list/ dict其他这样的名称作为变量,它们最终会影响实际的内置函数.