2
$\begingroup$

I have an list:

l = {{4,5},{7,8},{9,5},{3,2},{1,2},{13,12}}. 

I want to take the elements in the list in the sequential order. For example the first element in the list is {4,5} and I want to select the first member in the sub-list, 4, then I want to go to the second element in the list {7,8} and to take the first element 7. This process continues up to {13,12} and selecting 13. How can I do this?

$\endgroup$
5
  • $\begingroup$ {{4,5},{7,8},{9,5},{3,2},{1,2},{13,12}}[[All,1]] ? $\endgroup$ Jul 6, 2012 at 14:19
  • 1
    $\begingroup$ Either First /@ list or First[Transpose[list]] would be the ticket... $\endgroup$ Jul 6, 2012 at 14:19
  • 6
    $\begingroup$ Take a look at Part in the documentation, it is something you'll use a lot: reference.wolfram.com/mathematica/ref/Part.html $\endgroup$
    – VLC
    Jul 6, 2012 at 14:21
  • 1
    $\begingroup$ Where you are getting confused is with the idea that you need to do this "one by one". Mathematica does not need to do element-by-element arithmetic on lists "one by one" as if looping over the list. See this question for some useful parts of the Mathematica language that are more efficient and faster to write than the procedural way you are thinking about it now. $\endgroup$
    – Verbeia
    Jul 6, 2012 at 20:10
  • $\begingroup$ @mr.wizard I wouldn't call this a moving target because the OP edited it fairly quickly after posting and all but one answer addresses the modified question. By editing, you've rendered the other answers kinda silly. Such minor additions are better off in the same question. Granted, if it were me, I would notify acl to let him know of the change, but that's about it. Moving goal posts would imply repeated editing to change the scope once the answers have been given to try and squeeze more out of a single question, which is not the case here. $\endgroup$
    – rm -rf
    Jul 7, 2012 at 14:23

6 Answers 6

4
$\begingroup$

You want to take the first number if sublist #1 and add a random number between 1 and 10 to it (not specified whether this should be an integer or real), then take the first element of sublist #2 and add a random number -- in this case the range is not specified so I am assuming this is also between 1 and 10 ...and so on.

Mathematica works better when you work on entire lists rather than thinking about doing things element by element.

l = {{4,5},{7,8},{9,5},{3,2},{1,2},{13,12}}

So take all the first numbers using Part:

l[[All,1]]

and add a list of random numbers to it using Plus

l[[All, 1]] + RandomReal[{1, 10}, Length[l]]

So in other words you simply add a list of random numbers to your list of first numbers. Depending on how to interpret your question this could be the end of it because a random number has been added to all the first numbers. However if you wanted to actually modify your original list then

l[[All, 1]] = l[[All, 1]] + RandomReal[{1, 10}, Length[l]]

We can have look at the newly modified list:

    l
   {{6.74801,5},{9.96048,8},{15.1219,5},{9.83344,2},{10.3313,2},{18.5355,12}}
$\endgroup$
0
9
$\begingroup$

For instance,

lst = {{4, 5}, {7, 8}, {9, 5}, {3, 2}, {1, 2}, {13, 12}};
lst[[All, 1]]

(*
{4, 7, 9, 3, 1, 13}
*)
$\endgroup$
5
$\begingroup$

Another example using Apply at level 1 or @@@:

lst = {{4, 5}, {7, 8}, {9, 5}, {3, 2}, {1, 2}, {13, 12}};
#1 + RandomReal[{1, 10}] & @@@ lst

This addresses your question of selecting elements one-by-one and adding a random number between 1 and 10 to it. If, as the title suggests, all you want to do is to pick the first element one-by-one, then you only need #1 & @@@ lst.

Note that "vectorized" approaches will be far faster, and as Verbeia notes, you should exploit the Listable attribute of several built-ins. One such solution would be:

# + RandomReal[{1, 10}, Length@#] &@First@Transpose@lst
$\endgroup$
1
  • 1
    $\begingroup$ Clarification for beginners #1 & @@@ lst $\endgroup$ Jul 6, 2012 at 16:46
4
$\begingroup$

Also, for example:

lst = {{4, 5}, {7, 8}, {9, 5}, {3, 2}, {1, 2}, {13, 12}};

Transpose[lst][[1]]

Take[Transpose@lst, 1]

lst /. {a_, _} -> a

These will all return the first column of lst, which you can add to a vector of random numbers as desired. You can create that random vector using RandomInteger[{1, 10}, Length[lst]].

$\endgroup$
2
$\begingroup$
l = {{4,5},{7,8},{9,5},{3,2},{1,2},{13,12}};
l[[#]] + {RandomInteger[{1,10}], 0} & /@ Range[Length[l]]

This should return the initial list 'l' with the first sub element of each element modified by addition of a random Integer between 1 and 10. The output looks like:

{{11, 5}, {16, 8}, {19, 5}, {9, 2}, {8, 2}, {15, 12}}
$\endgroup$
1
  • $\begingroup$ This gives the correct output but there is no need to map the function part by part. Addition works element-by-element on lists (vectors, matrices, tensors). $\endgroup$
    – Verbeia
    Jul 6, 2012 at 21:10
1
$\begingroup$

You question isnt entirely clear, but if what you want to do is get the whole matrix with random numbers added to the first column, then this is what you want:

lst + Transpose[{RandomInteger[{1,10},Length[lst]],ConstantArray[0,Length[lst]]}]

It would be worth looking up in the documentation about Listable functions. Mathematica can do arithmetic on vectors, matrices and tensors directly without having to build up the calculation part by part. So while the answer of Alex gives the correct output, it is a very roundabout way to do it.

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.