39

Is there a "pythonic" way of getting only certain values from a list, similar to this perl code:

my ($one,$four,$ten) = line.split(/,/)[1,4,10]
ennuikiller
  • 46,381
  • 14
  • 112
  • 137

8 Answers8

43

Using a list comprehension

line = '0,1,2,3,4,5,6,7,8,9,10'
lst = line.split(',')
one, four, ten = [lst[i] for i in [1,4,10]]
has2k1
  • 2,095
  • 18
  • 16
26

I think you are looking for operator.itemgetter:

import operator
line=','.join(map(str,range(11)))
print(line)
# 0,1,2,3,4,5,6,7,8,9,10
alist=line.split(',')
print(alist)
# ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10']
one,four,ten=operator.itemgetter(1,4,10)(alist)
print(one,four,ten)
# ('1', '4', '10')
unutbu
  • 842,883
  • 184
  • 1,785
  • 1,677
9
lst = line.split(',')
one, four, ten = lst[1], lst[4], lst[10]
SilentGhost
  • 307,395
  • 66
  • 306
  • 293
5

Try operator.itemgetter (available in python 2.4 or newer):

Return a callable object that fetches item from its operand using the operand’s ____getitem____() method. If multiple items are specified, returns a tuple of lookup values.

>>> from operator import itemgetter
>>> line = ','.join(map(str, range(11)))
>>> line
'0,1,2,3,4,5,6,7,8,9,10'
>>> a, b, c = itemgetter(1, 4, 10)(line.split(','))
>>> a, b, c
('1', '4', '10')

Condensed:

>>> # my ($one,$four,$ten) = line.split(/,/)[1,4,10]
>>> from operator import itemgetter
>>> (one, four, ten) = itemgetter(1, 4, 10)(line.split(','))
miku
  • 181,842
  • 47
  • 306
  • 310
3

How about this:

index = [1, 0, 0, 1, 0]
x = [1, 2, 3, 4, 5]
[i for j, i in enumerate(x) if index[j] == 1]
#[1, 4]
qua
  • 972
  • 1
  • 8
  • 22
1

Yes:

data = line.split(',')
one, four, ten = data[1], data[4], data[10]

You can also use itemgetter, but I prefer the code above, it's clearer, and clarity == good code.

Lennart Regebro
  • 167,292
  • 41
  • 224
  • 251
0

Alternatively, if you had a Numpy array instead of a list, you could do womething like:

from numpy import array

# Assuming line = "0,1,2,3,4,5,6,7,8,9,10"
line_array = array(line.split(","))

one, four, ten = line_array[[1,4,10]]

The trick here is that you can pass a list (or a Numpy array) as array indices.

EDIT : I first thought it would also work with tuples, but it's a bit more complicated. I suggest to stick with lists or arrays.

PhilMacKay
  • 865
  • 2
  • 10
  • 22
0

Using pandas:

import pandas as pd
line = "0,1,2,3,4,5,6,7,8,9,10"
line_series = pd.Series(line.split(','))
one, four, ten = line_series[[1,4,10]]
Kirthi
  • 1
  • 1