Python片段列表中的第一个和最后一个元素

有没有办法只切片列表中的第一个和最后一个项目?

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

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

这样做(显然[0,-1]是无效的语法):

 >>> first_item, last_item = some_list[0,-1] >>> print first_item '1' >>> print last_item 'F' 

有些事情我已经尝试过了:

 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]: [] ... 

单程:

 some_list[::len(some_list)-1] 

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

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

只是想我会展示如何用numpy的花哨索引来做到这一点:

 >>> 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]方法不适用于:

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

正如DSM指出的那样,您可以使用itemgetter做类似的事情:

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

你可以这样做:

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

那这个呢?

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

看来,有些人正在回答错误的问题。 你说你想做:

 >>> first_item, last_item = some_list[0,-1] >>> print first_item '1' >>> print last_item 'F' 

也就是说,您想要将第一个和最后一个元素分别提取为单独的variables。

在这种情况下,Matthew Adams,pemistahl和katrielalex的答案是有效的。 这只是一个复合作业:

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

但是后来你说出了一个复杂的问题:“我把它分裂成一个线,而且要花两次时间来分解它:”

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

所以为了避免两次split()调用,你只能在分割一次的列表上进行操作。

在这种情况下,试图在一条线上做太多的工作是不利于清晰和简单的。 使用一个variables来保存分割的结果:

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

其他答复回答了“如何得到一份新清单,包括清单的第一个和最后一个要素?”的问题。 他们可能是受到你的标题的启发,根据仔细阅读你的问题,标题提到了你实际上不想要的切片。

AFAIK有三种方式获得一个列表的第0和最后一个元素的新列表:

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

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

其实我只是明白了

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

你可以使用“

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

如果你真的想使用切片。 这样做的好处是它不能给出索引错误,并且与长度为1或0的列表一起工作。

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

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

你可以把它内联(在使用时为了简洁起见, from operator import itemgetter之后):

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

但是如果您将重复使用getter,则可以通过提前创build一次来保存重新创build它的工作(并为其提供一个有用的自我logging名称)。

因此,对于您的具体使用情况,您可以replace:

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

有:

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

并且只split一次而不将完整list存储在用于len检查或双重索引等的持久名称中。

请注意, itemgetter为多个项目返回一个tuple ,而不是一个list ,所以如果你不只是解压缩到特定的名称,并需要一个真正的list ,你必须包装在list构造函数的调用。

Python 3只回答(不使用切片或丢弃list的其余部分,但可能已经足够好了)是使用拆包概括来获得firstlast独立的中间:

 first, *_, last = some_list 

select_作为争论“rest”的select是任意的; 他们将被存储在名字_这经常被用作“我不关心的东西”的替身。

不像许多其他解决scheme,这将确保序列中至less有两个元素; 如果只有一个(所以firstlast是相同的),它会引发一个exception( ValueError )。

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

答案适用于特定的第一个和最后一个,但是像我这样的一些人可能正在寻找一个解决scheme,可以应用到一个更一般的情况下,您可以从列表的任何一边返回前N个点(比如说一个sorting列表,只想要5最高或最低),我想出了以下解决scheme:

 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个数字的示例:

 In [2] GetWings([1,2,3,4,5,6,7,8,9,10],3) #Out[2] #[1, 2, 3, 8, 9, 10] 
 def recall(x): num1 = x[-4:] num2 = x[::-1] num3 = num2[-4:] num4 = [num3, num1] return num4 

现在只需在函数之外创build一个variables并调用函数:像这样:

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