lollygagger
lollygagger

Reputation: 395

Editing elements in a list in python

How do I remove a character from an element in a list?

Example:

mylist = ['12:01', '12:02']

I want to remove the colon from the time stamps in a file, so I can more easily convert them to a 24hour time. Right now I am trying to loop over the elements in the list and search for the one's containing a colon and doing a substitute.

for num in mylist:
    re.sub(':', '', num)

But that doesn't seem to work.

Help!

Upvotes: 17

Views: 24758

Answers (6)

Matifou
Matifou

Reputation: 8900

Instead of list comprehension, you can also use a map call:

mylist = ['12:01', '12:02']
map(lambda f: f.replace(':', ''), mylist) 

Returns:

['1201', '1202']

Upvotes: 0

Ben Gartner
Ben Gartner

Reputation: 14923

Strings in python are immutable, meaning no function can change the contents of an existing string, only provide a new string. Here's why.

See here for a discussion on string types that can be changed. In practice though, it's better to adjust to the immutability of strings.

Upvotes: 0

Alex Martelli
Alex Martelli

Reputation: 882181

The list comprehension solution is the most Pythonic one, but, there's an important twist:

mylist[:] = [s.replace(':', '') for s in mylist]

If you assign to mylist, the barename, as in the other answer, rather than to mylist[:], the "whole-list slice", as I recommend, you're really doing something very different than "replacing entries in the list": you're making a new list and just rebinding the barename that you were previously using to refer to the old list.

If that old list is being referred to by multiple names (including entries in containers), this rebinding doesn't affect any of those: for example, if you have a function which takes mylist as an argument, the barename assignment has any effect only locally to the function, and doesn't alter what the caller sees as the list's contents.

Assigning to the whole-list slice, mylist[:] = ..., alters the list object rather than mucking around with switching barenames' bindings -- now that list is truly altered and, no matter how it's referred to, the new value is what's seen. For example, if you have a function which takes mylist as an argument, the whole-list slice assignment alters what the caller sees as the list's contents.

The key thing is knowing exactly what effect you're after -- most commonly you'll want to alter the list object, so, if one has to guess, whole-list slice assignment is usually the best guess to take;-). Performance-wise, it makes no difference either way (except that the barename assignment, if it keeps both old and new list objects around, will take up more memory for whatever lapse of time both objects are still around, of course).

Upvotes: 24

sambha
sambha

Reputation: 1353

You have to insert the return of re.sub back in the list. Below is for a new list. But you can do that for mylist as well.

mylist = ['12:01', '12:02']
tolist = []
for num in mylist:
  a = re.sub(':', '', num)
  tolist.append(a)

print tolist

Upvotes: 0

Pär Wieslander
Pär Wieslander

Reputation: 28934

Use a list comprehension to generate a new list:

>>> mylist = ['12:01', '12:02']
>>> mylist = [s.replace(':', '') for s in mylist]
>>> print mylist
['1201', '1202']

The reason that your solution doesn't work is that re.sub returns a new string -- strings are immutable in Python, so re.sub can't modify your existing strings.

Upvotes: 17

TooAngel
TooAngel

Reputation: 883

for i, num in enumerate(mylist):
    mylist[i] = num.replace(':','')

Upvotes: 4

Related Questions