Python slice first and last element in list
有没有办法只对列表中的第一项和最后一项进行切片?
例如,如果这是我的列表:
1 2 | >>> some_list ['1', 'B', '3', 'D', '5', 'F'] |
我想这样做(显然
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') |
注意,它还支持任意索引位置,
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唯一的答案(不使用切片或丢弃其余的
1 | first, *_, last = some_list |
选择
与许多其他解决方案不同,此解决方案将确保序列中至少有两个元素;如果只有一个元素(因此
这个怎么样?
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) |
这不是一个"切片",但它是一个不使用显式索引的通用解决方案,适用于所讨论的序列是匿名的场景(因此,您可以在同一行上创建和"切片",而不创建两次和两次索引):
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) |
您只需将其内联为(在
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("-")) |
而
注意,对于多个项目,
这些都很有趣,但是如果您有一个版本号,并且您不知道字符串中任何一个段的大小,并且您想删除最后一个段,那该怎么办呢?比如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) |