2016-02-05 228 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]