【发布时间】:2010-01-25 18:21:19
【问题描述】:
是否有一种“pythonic”方式从列表中仅获取某些值,类似于此 perl 代码:
my ($one,$four,$ten) = line.split(/,/)[1,4,10]
【问题讨论】:
是否有一种“pythonic”方式从列表中仅获取某些值,类似于此 perl 代码:
my ($one,$four,$ten) = line.split(/,/)[1,4,10]
【问题讨论】:
使用列表推导
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]]
【讨论】:
我想你在找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')
【讨论】:
试试operator.itemgetter(python 2.4 或更新版本可用):
返回一个可调用对象,该对象使用操作数的 ____getitem____() 方法从其操作数中获取项目。如果指定了多个项目,则返回查找值的元组。
>>> 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')
精简:
>>> # my ($one,$four,$ten) = line.split(/,/)[1,4,10]
>>> from operator import itemgetter
>>> (one, four, ten) = itemgetter(1, 4, 10)(line.split(','))
【讨论】:
lst = line.split(',')
one, four, ten = lst[1], lst[4], lst[10]
【讨论】:
这个怎么样:
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]
【讨论】:
是的:
data = line.split(',')
one, four, ten = data[1], data[4], data[10]
也可以使用itemgetter,不过我更喜欢上面的代码,更清晰,清晰==好代码。
【讨论】:
或者,如果你有一个 Numpy 数组而不是一个列表,你可以这样做:
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]]
这里的诀窍是您可以将列表(或 Numpy 数组)作为数组索引传递。
编辑:我最初认为它也适用于元组,但它有点复杂。我建议坚持使用列表或数组。
【讨论】:
使用熊猫:
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]]
【讨论】: