python将列表中的第一个和最后一个元素切片

Python slice first and last element in list

有没有办法只对列表中的第一项和最后一项进行切片?

例如,如果这是我的列表:

1
2
>>> some_list
['1', 'B', '3', 'D', '5', 'F']

我想这样做(显然[0,-1]不是有效的语法):

1
2
3
4
5
>>> first_item, last_item = some_list[0,-1]
>>> print first_item
'1'
>>> print last_item
'F'

我尝试过的一些事情:

1
2
3
4
5
6
7
8
9
In [3]: some_list[::-1]
Out[3]: ['F', '5', 'D', '3', 'B', '1']

In [4]: some_list[-1:1:-1]
Out[4]: ['F', '5', 'D', '3']

In [5]: some_list[0:-1:-1]
Out[5]: []
...


一种方式:

1
some_list[::len(some_list)-1]

更好的方法(不使用切片,但更容易阅读):

1
[some_list[0], some_list[-1]]


我想我将展示如何使用numpy的奇特索引:

1
2
3
4
5
>>> import numpy
>>> some_list = ['1', 'B', '3', 'D', '5', 'F']
>>> numpy.array(some_list)[[0,-1]]
array(['1', 'F'],
      dtype='|S1')

注意,它还支持任意索引位置,[::len(some_list)-1]方法不适用于:

1
2
3
>>> numpy.array(some_list)[[0,2,-1]]
array(['1', '3', 'F'],
      dtype='|S1')

正如DSM指出的,您可以使用itemgetter执行类似的操作:

1
2
3
>>> import operator
>>> operator.itemgetter(0, 2, -1)(some_list)
('1', '3', 'F')


1
first, last = some_list[0], some_list[-1]

似乎有些人回答错了问题。你说你想做:

1
2
3
4
5
>>> first_item, last_item = some_list[0,-1]
>>> print first_item
'1'
>>> print last_item
'F'

也就是说,要将第一个和最后一个元素分别提取到单独的变量中。

在这种情况下,Matthew Adams、Pemistahl和KatrielAlex的回答是有效的。这只是一个复合任务:

1
first_item, last_item = some_list[0], some_list[-1]

但后来你说了一个复杂的情况:"我把它分成了同一行,那就得花时间把它分成两部分。"

1
x, y = a.split("-")[0], a.split("-")[-1]

因此,为了避免两个split()调用,您必须只对由split一次产生的列表进行操作。

在这种情况下,试图在一行中做太多的事情会损害清晰性和简单性。使用变量保存拆分结果:

1
2
lst = a.split("-")
first_item, last_item = lst[0], lst[-1]

其他回答回答了"如何获得一个由列表的第一个和最后一个元素组成的新列表"的问题。根据仔细阅读你的问题,他们可能是受到你的标题的启发,其中提到了切块,而你实际上并不想要。

afaik有三种方法可以获取包含列表第0个和最后一个元素的新列表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>>> s = 'Python ver. 3.4'
>>> a = s.split()
>>> a
['Python', 'ver.', '3.4']

>>> [ a[0], a[-1] ]        # mentioned above
['Python', '3.4']

>>> a[::len(a)-1]          # also mentioned above
['Python', '3.4']

>>> [ a[e] for e in (0,-1) ] # list comprehension, nobody mentioned?
['Python', '3.4']

# Or, if you insist on doing it in one line:
>>> [ s.split()[e] for e in (0,-1) ]
['Python', '3.4']

列表理解方法的优点是,元组中的一组索引可以是任意的,并且可以通过编程方式生成。


你可以这样做:

1
some_list[0::len(some_list)-1]

python 3唯一的答案(不使用切片或丢弃其余的list,但可能足够好)是使用解包归纳使firstlast从中间分开:

1
first, *_, last = some_list

选择_作为"其余"论点的口号是任意的;它们将以_的名义存储,这通常被用作"我不在乎的东西"的代言人。

与许多其他解决方案不同,此解决方案将确保序列中至少有两个元素;如果只有一个元素(因此firstlast相同),则会引发异常(ValueError)。


这个怎么样?

1
>>> first_element, last_element = some_list[0], some_list[-1]

实际上,我只是想知道:

1
2
In [20]: some_list[::len(some_list) - 1]
Out[20]: ['1', 'F']

更一般的情况:从列表的每一端返回n个点

答案适用于特定的第一个和最后一个问题,但有些人,像我自己,可能正在寻找一个解决方案,可以应用于更一般的情况,在这种情况下,您可以从列表的任意一侧返回前n个点(假设您有一个排序列表,只需要5个最高或最低),我提出了以下解决方案:

1
2
3
4
5
6
7
8
In [1]
def GetWings(inlist,winglen):
    if len(inlist)<=winglen*2:
        outlist=inlist
    else:
        outlist=list(inlist[:winglen])
        outlist.extend(list(inlist[-winglen:]))
    return outlist

以及一个返回列表1-10中最下面和最前面3个数字的示例:

1
2
3
4
5
In [2]
GetWings([1,2,3,4,5,6,7,8,9,10],3)

#Out[2]
#[1, 2, 3, 8, 9, 10]

你可以用类似的东西

1
y[::max(1, len(y)-1)]

如果你真的想用切片。这样做的好处是,它不能给出索引错误,也可以使用长度为1或0的列表。


另一个python3解决方案使用带有"*"字符的tuple解包:

1
first, *_, last = range(1, 10)


这不是一个"切片",但它是一个不使用显式索引的通用解决方案,适用于所讨论的序列是匿名的场景(因此,您可以在同一行上创建和"切片",而不创建两次和两次索引):operator.itemgetter

1
2
3
4
5
6
7
8
import operator

# Done once and reused
first_and_last = operator.itemgetter(0, -1)

...

first, last = first_and_last(some_list)

您只需将其内联为(在from operator import itemgetter之后,为了使用时的简洁性):

1
first, last = itemgetter(0, -1)(some_list)

但是,如果您要大量重用getter,您可以通过提前创建一次来保存重新创建它的工作(并为其提供一个有用的、自记录的名称)。

因此,对于您的特定用例,您可以替换:

1
x, y = a.split("-")[0], a.split("-")[-1]

用:

1
x, y = itemgetter(0, -1)(a.split("-"))

split只存储一次,不将完整的list以持久的名称存储,用于len检查或双索引等。

注意,对于多个项目,itemgetter返回一个tuple,而不是一个list,因此如果您不只是将其解包到特定的名称,并且需要一个真正的list,则必须将调用包装在list构造函数中。


这些都很有趣,但是如果您有一个版本号,并且您不知道字符串中任何一个段的大小,并且您想删除最后一个段,那该怎么办呢?比如20.0.1.300,我想以20.0.1结尾,而不是300结尾。到目前为止我有:

1
str('20.0.1.300'.split('.')[:3])

以列表形式返回:

1
['20', '0', '1']

我怎样才能把它变成一个用句点分隔的字符串呢

1
20.0.1

我发现这可能会做到:

1
list[[0,-1]]

1
2
3
4
5
6
def recall(x):
    num1 = x[-4:]
    num2 = x[::-1]
    num3 = num2[-4:]
    num4 = [num3, num1]
    return num4

现在只需在函数外部创建一个变量并调用函数:如下所示:

1
2
avg = recall("idreesjaneqand")
print(avg)