【问题标题】:"Slice lists" and "the ellipsis" in Python; slicing lists and lists of lists with lists of slicesPython中的“切片列表”和“省略号”;切片列表和带有切片列表的列表列表
【发布时间】:2010-12-14 12:00:48
【问题描述】:

原始问题:有人可以告诉我如何使用“切片列表”和“省略号”吗?它们什么时候有用?谢谢。

以下是关于“slice_list”和“ellipsis”的语言定义; Alex Martelli 的回答指出了它们的起源,这不是我所设想的。

[http://docs.python.org/reference/expressions.html#tok-slicing][1]

5.3.3。切片

extended_slicing ::= 主要“[” slice_list "]"

slice_list ::= slice_item ("," slice_item)* [","]

slice_item ::= 表达式 | 适当的切片 |省略号

省略号 ::= "..."

[1]: http://docs.python.org/reference/expressions.html#tok-slicing

如果有人(像我一样)正在寻找使用切片列表攻击列表(或列表列表)的方法,这里有 5 种方法可以从列表中获取由 a 选择的元素列表切片列表和对列表列表执行相同操作的 2 种方法,在这种情况下,每个列表应用一个切片。输出在最后的评论中。我发现 h5,使用嵌套 for 循环的示例,如果不使用有意义的变量名(更新),则最难理解。

#!/usr/bin/env python



import itertools

puz = [(i + 100) for i in range(40)]
puz1 = list( puz)
puz2 = [(i + 200) for i in range(40)]
puz3 = [(i + 300) for i in range(40)]
puzs = [puz1,puz2,puz3]

sa = slice( 0,1,1)
sb = slice( 30,39,4)
sc = slice( -1, -15,-5)
ss = [sa,sb,sc]

def mapfunc( a,b):
    return a[b]

f = map( mapfunc,[puz] * len(ss),ss)
print "f =  ", f  #same as g below

g = [ puz[i]
    for i in ss ]
print "g =  ",g  #same as f, above

h1 = [ i 
    for i in itertools.chain( puz[sa],puz[sb],puz[sc]) ]
print "h1 = ", h1  #right 

h2 = [ i
    for i in itertools.chain( *(map( mapfunc,[puz] * len(ss),ss))) ]
print "h2 = ",h2  #right

h3 = [ i
    for i in itertools.chain( *f) ]
print "h3 = ",h3  #right

h4 = [ i 
    for i in itertools.chain( *g) ]
print "h4 = ", h4 #also right

h5 = []
for slice_object in ss:
    for list_element in puz[slice_object]:
        h5.append( list_element)
print "h5 = ", h5  #right, too

print "=============================="

hh1 = [ i
    for i in itertools.chain( *(map( mapfunc,puzs,ss))) ]
print "hh1 =  ",hh1  #right

puz_s_pairs = zip( puzs,ss)
#print "puz_s_pairs = ",puz_s_pairs
hh2 = [ i
    for i in itertools.chain( *(map( mapfunc,*zip( *puz_s_pairs)))) ]
print "hh2 =  ",hh2  #right

'''
>>> execfile(r'D:/cygwin/home/usr01/wrk/py/pyexpts/list_of_slices_of_list.02.py')
f =   [[100], [130, 134, 138], [139, 134, 129]]
g =   [[100], [130, 134, 138], [139, 134, 129]]
h1 =  [100, 130, 134, 138, 139, 134, 129]
h2 =  [100, 130, 134, 138, 139, 134, 129]
h3 =  [100, 130, 134, 138, 139, 134, 129]
h4 =  [100, 130, 134, 138, 139, 134, 129]
h5 =  [100, 130, 134, 138, 139, 134, 129]
==============================
hh1 =   [100, 230, 234, 238, 339, 334, 329]
hh2 =   [100, 230, 234, 238, 339, 334, 329]
'''

【问题讨论】:

    标签: python list slice itertools


    【解决方案1】:

    切片列表和省略号最初是在 Python 中引入的,目的是为 numpy(好老的 Numeric)的前身提供漂亮的语法糖。如果你正在使用 numpy(没有理由回到它的任何前辈!-)你当然应该使用它们;如果出于某种奇怪的原因您正在自己实现超灵活的多维数组,那么您肯定会想研究 numpy 使用它们的方式并可能密切模仿它(它非常好毕竟设计的)。除了多维数组,我想不出好的用途。

    【讨论】:

    • 啊。因此,我不认为“切片列表”是一种在一个紧凑表达式中剔除任意、多次运行的列表的方法。遗憾。我几乎可以使用它。
    • 对于“列表运行”阅读“从单个一维列表运行”。
    • @behindthefalls,不,运行通常是用 itertools.groupby 提取的——没有特殊的语法。你当然可以在你自己的对象中实现这样的语法,但不确定它是否对大多数人来说都是可读的。
    • Alex,感谢 itertools.groupby 提示:我从未注意到该操作,但我会去看看。我感谢您的帮助。我试图理解我 4 年前编写的代码,并且(希望)简化了许多列表/设置循环。我突然想到,如果合法的话,我可以将一些东西预先打包为切片或切片列表。回到绘图板。
    • itertools.groupby 做了一些不同的事情,但是有几种方法可以让切片列表按预期工作。可怜的名单永远不知道是什么击中了它。现在,如果我可以获得切片列表以对列表列表进行操作..
    【解决方案2】:

    Numpy 使用它们来实现数组切片。

    【讨论】:

    • 省略号——很少使用。切片——常见。
    【解决方案3】:

    我不太确定省略号,所以我不会解决这个问题,以免给你一个错误的答案。

    这里是列表切片:

    我希望您知道列表索引从 0 开始。

    l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    

    索引到列表中:

    l[0]
    >>> 0
    
    l[5]
    >>> 5
    

    切片列表。第一个索引包括在内,但不是最后一个:

    l[0:5]
    >>> [0, 1, 2, 3, 4]
    
    l[2:5]
    >>> [2, 3, 4]
    

    将整个列表作为一个切片返回:

    l[:]
    >>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    

    获取包含每个元素的列表切片,包括第三个索引和之后的元素:

    l[3:]
    >>> [3, 4, 5, 6, 7, 8, 9]
    

    获取列表的切片,其中包含直到第 5 个索引但不包括第 5 个索引的每个元素:

    l[:5]
    >>> [0, 1, 2, 3, 4]
    

    这是你不希望 python 做的事情:

    l[5:18]  # note: there is no 18th index in this list
    >>> [5, 6, 7, 8, 9]
    

    【讨论】:

    • 请注意,l[:] 选项是复制数组的简写,您会经常看到它。
    • 当我遇到这样一个事实,即语言允许您使用逗号分隔的两个或多个切片表达式时,我感到很困惑! ;-)
    猜你喜欢
    • 1970-01-01
    • 2014-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    • 2015-02-19
    • 2014-05-13
    • 1970-01-01
    相关资源
    最近更新 更多