有没有办法在列表中只切了第一和最后一个项目?
例如; 如果这是我的名单:
>>> 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]: []
...
Answer 1:
单程:
some_list[::len(some_list)-1]
一个更好的方法(不使用切片,但是更容易阅读):
[some_list[0], some_list[-1]]
Answer 2:
只是想我会展示如何在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')
作为帝斯曼指出,你可以做类似的事情itemgetter :
>>> import operator
>>> operator.itemgetter(0, 2, -1)(some_list)
('1', '3', 'F')
Answer 3:
first, last = some_list[0], some_list[-1]
Answer 4:
你可以像下面这样做:
some_list[0::len(some_list)-1]
Answer 5:
有些人回答错误的问题,它似乎。 你说你想做的事:
>>> first_item, last_item = some_list[0,-1]
>>> print first_item
'1'
>>> print last_item
'F'
即,要提取每个第一和最后一个元素成独立的变量。
在这种情况下,由马修·亚当斯,pemistahl和katrielalex答案是有效的。 这仅仅是一个复合赋值:
first_item, last_item = some_list[0], some_list[-1]
但后来你说出一个复杂:“我分裂它在同一直线上,并且将不得不花费时间分裂两次:”
x, y = a.split("-")[0], a.split("-")[-1]
所以,为了避免两个分割()调用,您只能从一次分裂产生的列表进行操作。
在这种情况下,试图做太多的一条线是一个损害清晰和简单。 使用一个变量来保存拆分结果:
lst = a.split("-")
first_item, last_item = lst[0], lst[-1]
其他回应回答了这个问题:“如何获得新的列表,包括列表的第一个和最后一个元素的?” 它们很可能是你的标题,其中提到切片,你其实不想启发,根据你的问题的仔细阅读。
据我所知有3种方式来获得一个列表的第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']
列表解析方法的优点是,在元组中的索引集可以是任意的,程序生成。
Answer 6:
那这个呢?
>>> first_element, last_element = some_list[0], some_list[-1]
Answer 7:
Python 3中只回答(不使用切片或扔掉的剩余list
,但可能不够好反正)是使用拆包概括获得first
和last
从中间分开:
first, *_, last = some_list
的选择_
为包罗万象的自变量“休息”是任意的; 他们将被存储在名称_
这是经常被用来作为一个替身“的东西,我不关心。”
不像许多其他的解决方案,这其中将确保有序列中的至少两种元素; 如果只有一个(所以first
和last
是相同的),这将引发一个异常( ValueError
)。
Answer 8:
其实,我只是想通了:
In [20]: some_list[::len(some_list) - 1]
Out[20]: ['1', 'F']
Answer 9:
更一般的情况:从列表的每一端返回N个点
答案为特定的第一和最后一个,但有些,像我这样的,可能是在寻找可以应用到其中,你可以从列表中的任意一侧返回前N个点更一般的情况下,解决方案的工作(说你有排序列表,只需要5个最高或最低),我想出了以下解决方案:
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]
Answer 10:
您可以使用类似
y[::max(1, len(y)-1)]
如果你真的想用切片。 这样做的好处是,它不能给索引错误,长度为1或0列出工作为好。
Answer 11:
这不是一个“切片”,但它是不使用索引明确一个通用的解决方案,以及适用于该情形,即问题的顺序是匿名的(所以你可以创建并在同一行“片”,而不创建两次,两次索引): 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)
但是如果你会重用吸气很多,你可以节省重新创建工作(并给它一个有用的,自文档名称)通过创建一次的时间提前。
因此,对于您的具体使用情况,您可以取代:
x, y = a.split("-")[0], a.split("-")[-1]
有:
x, y = itemgetter(0, -1)(a.split("-"))
和split
一次,而不存储完整list
中的永久名称len
检查或双击索引等。
需要注意的是itemgetter
多个项目返回一个tuple
,而不是一个list
,所以如果你不只是它拆包特定的名称,需要一个真正的list
,你必须包裹在呼叫list
构造。
Answer 12:
另一个python3解决方案使用元组的“*”字符拆包:
first, *_, last = range(1, 10)
Answer 13:
这些都是有趣的,但如果你有一个版本号,你不知道从字符串中的任何一个部分的大小和要删除的最后一段。 像20.0.1.300和我想的东西用20.0.1落得没有300结尾。 我有这个至今:
str('20.0.1.300'.split('.')[:3])
它返回列表的形式为:
['20', '0', '1']
我怎么拿回来成句点分隔的一个字符串
20.0.1
Answer 14:
我发现这可能做到这一点:
list[[0,-1]]
Answer 15:
def recall(x):
num1 = x[-4:]
num2 = x[::-1]
num3 = num2[-4:]
num4 = [num3, num1]
return num4
现在,只要使函数外的变量和调用函数:是这样的:
avg = recall("idreesjaneqand")
print(avg)
文章来源: Python slice first and last element in list