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
的其余部分,但可能已经足够好了)是使用拆包概括来获得first
和last
独立的中间:
first, *_, last = some_list
select_
作为争论“rest”的select是任意的; 他们将被存储在名字_
这经常被用作“我不关心的东西”的替身。
不像许多其他解决scheme,这将确保序列中至less有两个元素; 如果只有一个(所以first
和last
是相同的),它会引发一个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)