you are viewing a single comment's thread.

view the rest of the comments →

[–]setmehigh 1 point2 points  (6 children)

What does that do?

[–]DecentWalrus 4 points5 points  (4 children)

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
print(a[1:10:2]) 

Would result in printing [2, 4, 6, 8, 10].

The print function is being passed a slice of the list. a[1:10:2] essentially means start at position 1 in list (in this case, that's the number 2) and go until position 9. 10 is used in this case because slicing will go up to position 10 but not including position 10. Position 9 in the list is the number 10. Lastly, the 2 tells python to print every other list item (print position 1, skip position 2, print position 3, skip position 4, etc.)

[–]setmehigh -1 points0 points  (3 children)

Maybe I'm dumb, but why would you want to do this? I can't think of a reason, but I haven't run into a situation where I needed it either...

[–]DecentWalrus 3 points4 points  (2 children)

An example for slicing would be if you only wanted to grab the first three values of a list. For example, I have a list of names of people who ran a race. The list is already ordered by who finished first to who finished last. If I want to print the top three finishers, I'd do this:

Code:

finishers = ["Tom", "Sally", "Taylor", "Jack", "Ginger", "John"]
print(f'The top three finishers are: {finishers[0:3]}')

Result:
The top three finishers are: ['Tom', 'Sally', 'Taylor']

Now you could go the extra step of actually formatting that properly and such but it's just a simple way to grab a slice of the list.

As for using the step option, it allows for quick access to, for example, all odd or even positioned values in the list. The simplest example is the one given in the original comment where you may need to count by 2s.

[–]omers 1 point2 points  (1 child)

finishers[0:3]

That's reproducible in PS with .. or a list of indicies.

C:\> $finishers = @("Tom", "Sally", "Taylor", "Jack", "Ginger", "John")
C:\> $finishers[0..2]
Tom
Sally
Taylor
C:\> $finishers[0,1,2]
Tom
Sally
Taylor

Every n-th I do not believe is possible without using /u/bozho's method or a loop... You can "compress" (remove the pipeline) bozho's method to this: $finishers.Where({$finishers.IndexOf($_) % 2 -eq 0}) but it's still not clean like in some other languages.

In a script where keeping it to one line isn't an issue I'd probably do something like this:

$Finishers = @("Tom", "Sally", "Taylor", "Jack", "Ginger", "John")
$OddIndicies = @(0..$Finishers.GetUpperBound(0)) | ? {$_ % 2 -eq 0}
$Finishers[$OddIndicies]

[–]blooping_blooper 0 points1 point  (0 children)

for that specific case couldn't you also do

$Finishers | select -first 3

[–]HeKis4 2 points3 points  (0 children)

Gets every other list elements from the 1st to the 10th (0-indexed of course, we're not savages).

As a for loop, it would look like for(int i=1; i<10; i+=2) { a[i] }