Python从列表中选择特定元素

39

有没有一种“pythonic”的方法从列表中仅获取特定的值,类似于这个Perl代码:

my ($one,$four,$ten) = line.split(/,/)[1,4,10]

1
顺便说一句,那不是有效的 Perl 代码。正确的写法应该是:my (...) = (split /,/, $line)[1,4,10]; - zdim
8个回答

43

使用列表推导式

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]]

26

我认为你正在寻找 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')

9
不完全是。如果你去掉示范代码,它可以看起来像这样:one、four、ten = operator.itemgetter(1、4、10)(line.split(',')) - Eric Palakovich Carr
你真是救星,谢谢!如果 timeit 正确使用的话,这应该将我们今天检查的代码片段的运行时间从9小时减少到几秒钟。 - Arne Babenhauserheide
1
不必使用库,当可以通过列表推导式实现时,参见@has2k1的答案。 - JStrahl

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

4
我认为你误解了问题。 - Idan K
@Idan:也许我有,难道我不能得到新列表的第2、第5和第11个元素吗? - SilentGhost
1
@Idan K:并没有要求“Pythonic”版本像Perl版本一样必须是单个表达式。 - Greg Hewgill
虽然itemgetter可能在一行中满足OP的要求,但我必须同意Lennart的观点,这个解决方案最易读和易理解。 - Corey Farwell

5

尝试使用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(','))

你真是救星,谢谢!如果 timeit 正确使用的话,这应该将我们今天检查的代码片段的运行时间从9小时减少到几秒钟。 - Arne Babenhauserheide

3
这样怎么样:
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]

1

是的:

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

你也可以使用itemgetter,但我更喜欢上面的代码,它更清晰,而清晰度等于好的代码。


0
使用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]]

0

或者,如果您有一个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数组)作为数组索引传递。

编辑:我最初认为元组也可以使用,但实际上更加复杂。建议仍然使用列表或数组。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接