DGT
DGT

Reputation: 2654

extract from a list of lists

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.

Upvotes: 5

Views: 31577

Answers (3)

Sam Dolan
Sam Dolan

Reputation: 32542

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]

Upvotes: 6

Skurmedel
Skurmedel

Reputation: 22179

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.

Upvotes: 5

eruciform
eruciform

Reputation: 7736

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.

Upvotes: 3

Related Questions