繁体   English   中英

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

[英]Remove an element at a specific position from every sublist

我有一个列表,例如:

a = [[1,'b',2],[3,':',4],[5,':',6]]

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

[[1,2],[3,4],[5,6]]

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

我选择使用列表理解来做到这一点。 这是一个代码示例,用于遍历子列表的每个项目:

for list in a:
    for number in list:
        print number

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

b = []

for list in a:
    for number in list:
        b = [number for number in list if number != 'b' and number != ':']
        print b

我得到以下输出:

[1, 2]
[1, 2]
[1, 2]
[3, 4]
[3, 4]
[3, 4]
[5, 6]
[5, 6]
[5, 6]

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

[1,2]
[3,4]
[5,6]

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

干杯。

如果您要删除的全部是b: ,则可以将嵌套列表理解与已设置的成员资格测试结合使用:

a_new = [[y for y in x if y not in {'b', ':'}] for x in a]

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

import numbers
a_new = [[y for y in x if isinstance(y, numbers.Number)] for x in a]

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

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

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

print(a_new)
[[1, 2], [3, 4], [5, 6]]

另一个要注意的地方, numbers.Number任何数字值(包括非理性值)的注入超类。 如果您的用例不包含复数,则可以改用numbers.Rationalnumbers.Real

最后一点,提到这里 ,请不要使用list / dict等这样的名字作为变量,他们最终阴影的实际建宏。

尝试这个

d=[[number2 for number2 in number if number2 != 'b' and number2 != ':'] for number in a ]

输出:

[[1、2],[3、4],[5、6]]

这似乎是一个XY问题 以下是一些选项,具体取决于您的实际工作

仅包括数字类型和返回列表

arr = [[1,'b',2], [3,':',4], [5,':',6]]

def is_num(x):
    return isinstance(x, (int, float))

arr = [[i for i in k if is_num(i)] for k in arr]

# [[1, 2], [3, 4], [5, 6]]

仅排除“ b”和“:”字符并返回列表

请参阅@Coldspeed的解决方案。

我也会列出理解,但这是del的变体。

lst = [[1,'b',2],[3,':',4],[5,':',6]]

for x in lst:
    for idx, y in enumerate(x):
        if y in {'b', ':'}:
            del x[idx]
            break

当然,这仅在只有一个特殊字符的情况下有效。 否则,您需要向后遍历子列表。

只需创建更多函数即可使所有内容更具可读性:

INVALID_ENTRIES = {':', 'b'}

def is_relevant_entry(entry):
    return entry not in INVALID_ENTRIES

def clean_item(item):
    return list(filter(is_relevant_entry, item))

def clean_list(lst):
    return list(map(clean_item, lst))

a = [[1,'b',2],[3,':',4],[5,':',6]]
result = clean_list(a)

我认为它比这些理解的一线好得多。

没有循环,名称传达了标准库的含义和用法:)

在python2中, mapfilter非常渴望,所以您不需要用list换行

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM