tags:

views:

58

answers:

3

How can I extract elements in a list of lists and create another one in python. So, I want to get from this:

all_list = [['1 2 3 4','2 3 4 5'],['2 4 4 5', '3 4 5 5' ]]

a new list like this:

list_of_lists = [[('3','4'),('4','5')], [('4','5'),('5','5')]]

Following is what I did, and it doesn't work.

for i in xrange(len(all_lists)):
   newlist=[]
   for l in all_lists[i]:
      mylist = l.split()
      score1 = float(mylist[2])
      score2 = mylist[3]
      temp_list = (score1, score2)
      newlist.append(temp_list)
   list_of_lists.append(newlist)

Please help. Many thanks in advance.

+2  A: 

It could work almost as-is if you filled in the value for mylist -- right now its undefined.

Hint: use the split function on the strings to break them up into their components, and you can fill mylist with the result.

Hint 2: Make sure that newlist is set back to an empty list at some point.

eruciform
you're right, i forgot to set back to an empty list. thanks.
DGT
+3  A: 

You could use a nested list comprehension. (This assumes you want the last two "scores" out of each string):

[[tuple(l.split()[-2:]) for l in list] for list in all_list]
sdolan
Great, i'll give it a try. Thanks a lot.
DGT
@DGT: You're welcome.
sdolan
+2  A: 

Adding to eruciforms answer.

First remark, you don't need to generate the indices for the all_list list. You can just iterate over it directly:

for list in all_lists:
    for item in list:
        # magic stuff

Second remark, you can make your string splitting much more succinct by splicing the list:

values = item.split()[-2:] # select last two numbers.

Reducing it further using map or a list comprehension; you can make all the items a float on the fly:

# make a list from the two end elements of the splitted list.
values = [float(n) for n in item.split()[-2:]] 

And tuplify the resulting list with the tuple built-in:

values = tuple([float(n) for n in item.split()[-2:]])

In the end you can collapse it all to one big list comprehension as sdolan shows.

Of course you can manually index into the results as well and create a tuple, but usually it's more verbose, and harder to change.

Took some liberties with your variable names, values would tmp_list in your example.

Skurmedel
Thanks a lot for your help.
DGT
@DGT: You are welcome.
Skurmedel
Nice explanation. Also, thanks for reminding me that the default to split is spaces.
sdolan