Remove empty strings from list

tec technic.tec at gmail.com
Mon Sep 14 22:33:05 EDT 2009


Chris Rebert 写道:
> On Mon, Sep 14, 2009 at 6:49 PM, Helvin <helvinlui at gmail.com> wrote:
>> Hi,
>>
>> Sorry I did not want to bother the group, but I really do not
>> understand this seeming trivial problem.
>> I am reading from a textfile, where each line has 2 values, with
>> spaces before and between the values.
>> I would like to read in these values, but of course, I don't want the
>> whitespaces between them.
>> I have looked at documentation, and how strings and lists work, but I
>> cannot understand the behaviour of the following:
>>                        line = f.readline()
>>                        line = line.lstrip() # take away whitespace at the beginning of the
>> readline.
>>                        list = line.split(' ') # split the str line into a list
>>
>>                        # the list has empty strings in it, so now,
>> remove these empty strings
>>                        for item in list:
>>                                if item is ' ':
>>                                        print 'discard these: ',item
>>                                        index = list.index(item)
>>                                        del list[index]         # remove this item from the list
>>                                else:
>>                                        print 'keep this: ',item
>> The problem is, when my list is :  ['44', '', '', '', '', '',
>> '0.000000000\n']
>> The output is:
>>    len of list:  7
>>    keep this:  44
>>    discard these:
>>    discard these:
>>    discard these:
>> So finally the list is:   ['44', '', '', '0.000000000\n']
>> The code above removes all the empty strings in the middle, all except
>> two. My code seems to miss two of the empty strings.
>>
>> Would you know why this is occuring?
> 
> Block quoting from http://effbot.org/zone/python-list.htm
> """
> Note that the for-in statement maintains an internal index, which is
> incremented for each loop iteration. This means that if you modify the
> list you’re looping over, the indexes will get out of sync, and you
> may end up skipping over items, or process the same item multiple
> times.
> """
> 
> Thus why your code is skipping over some elements and not removing them.
> Moral: Don't modify a list while iterating over it. Use the loop to
> create a separate, new list from the old one instead.

or use filter
list=filter(lambda x: len(x)>0, list)

> 
> Cheers,
> Chris
> --
> http://blog.rebertia.com



More information about the Python-list mailing list