2012-10-01 19 views
10

Bir öğe bir alt dizeyle eşleşiyorsa listeden nasıl çıkarılır?Listeden bir öğenin bir alt dizeyle eşleştirilmesi - Python

i kaldırılması gereken birkaç bitişik öğeler eksik ediyormuş gibi pop() ve enumerate yöntemi kullanarak bir listeden bir öğe çıkarmadan çalıştı ama görünüyor var:

sents = ['@$\tthis sentences needs to be removed', 'this doesnt', 
    '@$\tthis sentences also needs to be removed', 
    '@$\tthis sentences must be removed', 'this shouldnt', 
    '# this needs to be removed', 'this isnt', 
    '# this must', 'this musnt'] 

for i, j in enumerate(sents): 
    if j[0:3] == "@$\t": 
    sents.pop(i) 
    continue 
    if j[0] == "#": 
    sents.pop(i) 

for i in sents: 
    print i 

Çıktı:

this doesnt 
@$ this sentences must be removed 
this shouldnt 
this isnt 
#this should 
this musnt 

İstenilen çıktı:

this doesnt 
this shouldnt 
this isnt 
this musnt 
+3

Bu listede yinelenen öğeleri bir listeden kaldırma klasik vaka. Bununla ilgili düzinelerce diğer Stack Overflow sorularını okuyun. Ayrıca, [dokümanlardaki not] bölümüne bakın (http://docs.python.org/reference/compound_stmts.html#for). –

+1

Her zaman bir konteynerin uzunluğunu boyunca değiştirirken, bu devirdeki – wim

+0

için bir reçete olduğunu unutmayın Genel olarak, bir listeyi yerinde değiştirmeyi denemek daha iyi filtrelenmiş bir liste oluşturmak için daha iyidir. Sürdürülebilir algoritmalar, akılda tutulması her zaman daha kolaydır (yazmayı öğrenmek her zaman kolay olmasa da). Değerleri değiştirdiğinizde, bazen yerinde çalışma verimlilikleri artar, ancak bir listenin ortasına silerek veya eklediğinizde, genellikle daha az sağlam mantığınızla birlikte _worse_ verimi elde edersiniz. – abarnert

cevap

20

Nasıl Abo Basit gibi ut şey:

>>> [x for x in sents if not x.startswith('@$\t') and not x.startswith('#')] 
['this doesnt', 'this shouldnt', 'this isnt', 'this musnt'] 
+0

ah bir liste kavrama, zarif! izin ver deneyeyim. En temiz cevap için – alvas

+0

+1. – abarnert

8

Bu çalışması gerekir:

[i for i in sents if not ('@$\t' in i or '#' in i)] 

kullanmakta str.startswith(stringOfInterest) yöntemini

+2

Bunu açıkladığımdan eminim ki bu, diğer iki diziden daha iyi olduğunu düşünürken, alt dizgiler – Frikster

9

Başka bir teknik kullanmak cümlesel belirtilenler ile başlayan tek şey istiyorsanız filter

filter(lambda s: not (s[0:3]=="@$\t" or s[0]=="#"), sents) 

Orignal approac'inizdeki problem h, liste öğesi i üzerindeyken ve silinmesi gerektiğini belirledikten sonra, onu öğesinin i konumuna kaydırdığı listeden kaldırırsınız. Döngünün sonraki yinelemesi i+1 dizinindesiniz, ancak öğe aslında i+2'dur.

Mantıklı?

+0

'un başlangıcında olduğunu açıklıyor! Numaralandırılırken liste atma gerçekten aptalcadır. hahaha .. – alvas

+0

+1 problemi açıklamak için. – abarnert

İlgili konular