Python:如何从列表中的列表中删除一个列表?

3
我有一个集合,它说:
char={'J','A'}

以及一个列表的列表

content = [[1,'J', 2], [2, 'K', 3], [2, 'A', 3], [3,'A', 9], [5, 'J', 9]]

我试图从列表content中删除没有'J' & 'A'的列表项。我的做法是:

li = list(char)
char1= np.array(li)
content=np.array(content)
new_content=[]
for alphabet in content:
    if alphabet[1] in char1:
        new_content.append(alphabet)
print(new_content)

有没有高效的写作方式?如果charcontent元素数量较多,那么计算所需的时间会很长。


1
你为什么要在那里使用 np.array?当执行向量操作时,numpy非常高效,但你只是在循环。 - Bakuriu
1
这个问题有点不清楚。您是要删除content中包含'J'或'A'的所有列表吗?还是要删除content中包含'J'和'A'的所有列表?还是要从content中的每个列表中删除'J'和'A'? - timgeb
5个回答

3
>>> content = [[1,'J', 2], [2, 'K', 3], [2, 'A', 3], [3,'A', 9], [5, 'J', 9]]
>>> char={'J','A'}
content 中所有包含 'J' 和 'A' 的列表:
>>> [x for x in content if all(c in x for c in char)]
[]

content 中所有包含 'J' 或 'A' 的列表:
>>> [x for x in content if any(c in x for c in char)]
[[1, 'J', 2], [2, 'A', 3], [3, 'A', 9], [5, 'J', 9]]

2
content = [[1,'J', 2], [2, 'K', 3], [2, 'A', 3], [3,'A', 9], [5, 'J', 9]]
whitelist = {'J','A'}

remove = set()
for i,sub in enumerate(content):
    if sub[1] not in whitelist: remove.add(i)

content = [sub for i,sub in enumerate(content) if i not in whitelist]

@StevenRumbalski:没错。你应该把它发布为一个答案。 - inspectorG4dget

2
content = [[1,'J', 2], [2, 'K', 3], [2, 'A', 3], [3,'A', 9], [5, 'J', 9]]
whitelist = {'J','A'}

i = 0
while i<len(content):
    if content[i][1] not in whitelist:
        blacklist.pop(i)
        continue
    i += 1

@StevenRumbalski:不,如果你从列表中弹出一个项目,那么你不想增加索引,因为在pop之后,原来在索引n+1的项目将会在索引n处。 - inspectorG4dget

1
我会这样写:

我会这样写

char={'J','A'}
content = [[1,'J', 2], [2, 'K', 3], [2, 'A', 3], [3,'A', 9], [5, 'J', 9]]

filter(lambda x: all([i in char for i in x]), content)

1
content = [[1,'J', 2], [2, 'K', 3], [2, 'A', 3], [3,'A', 9], [5, 'J', 9]]
whitelist = {'J','A'}

content = [sub for sub in content if sub[1] not in whitelist]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接