2016-02-05 167 views
3

我有一套说Python:从列表中删除列表?

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'在执行* vector *操作时效率很高,但你只是循环。 – Bakuriu

+1

这个问题有点不清楚。您是否要删除包含'J'或'A'的'content'中的所有列表?你想删除'content'中包含'J'和'A'的所有列表吗?你想从'content'的每个列表中删除'J'和'A'吗? – timgeb

回答

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)] 
[] 

在所有列表有'J'或'A'的content

>>> [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] 
+0

什么是黑名单? – timgeb

+0

@timgeb:哎呀!感谢收获。固定 – inspectorG4dget

+0

@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 
+0

@StevenRumbalski:否。如果从列表中弹出一个项目,那么您不希望增加索引,因为以前在索引'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]