Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 根据列表项的索引模数执行不同的操作_Python_Python 2.7_List_Pandas_Slice - Fatal编程技术网

Python 根据列表项的索引模数执行不同的操作

Python 根据列表项的索引模数执行不同的操作,python,python-2.7,list,pandas,slice,Python,Python 2.7,List,Pandas,Slice,对于给定的列表,我希望: 仅对第一个元素,然后每第三个后续元素(索引3、6等)不执行任何操作 从第二个元素(索引1)开始,然后每3个元素(索引4、7等)执行一次特定操作 从第三个元素(索引2)开始,然后每3个元素(索引5、8等)执行一次不同的操作 我可以使用combinerange(len(mylist))和:符号按步骤对列表进行切片: 1::3 will give me the elements at indices 1, 4, 7, 10 etc. ::2 will give me the

对于给定的列表,我希望:

  • 仅对第一个元素,然后每第三个后续元素(索引3、6等)不执行任何操作
  • 从第二个元素(索引1)开始,然后每3个元素(索引4、7等)执行一次特定操作
  • 从第三个元素(索引2)开始,然后每3个元素(索引5、8等)执行一次不同的操作
  • 我可以使用combine
    range(len(mylist))
    符号按步骤对列表进行切片:

    1::3 will give me the elements at indices 1, 4, 7, 10 etc.
    
    ::2 will give me the elements at indices 0, 2, 4, 6 etc.
    
    但这里有几个问题:

    • 例如,我不需要访问元素6
    • 有一些重叠 在两片之间
    • 缺少诸如5之类的索引
    Python是否提供了一种用于自定义分步切片的内置机制?
    FWIW,我实际上是在处理pandas(版本0.18.0)系列,为了便于解释,我刚刚使用了常规列表的示例。

    您不需要对数据进行多次传递,也不需要进行任何切片:

    def nop(x): return x
    
    def op1(x): return x.upper()
    
    def op2(x): return x[::-1]
    
    data = 'One Two Three Four Five Six Seven Eight Nine'.split()
    
    result = [(nop, op1, op2)[i % 3](x) for i, x in enumerate(data)]
    
    这将产生以下
    结果

    ['One', 'TWO', 'eerhT', 'Four', 'FIVE', 'xiS', 'Seven', 'EIGHT', 'eniN']
    
    如果不清楚,
    (nop,op1,op2)
    的第(i%3)个元素用
    x
    作为参数调用,用于
    数据
    枚举中的每个索引
    i
    和元素
    x

    显然,如果您需要对
    数据
    执行操作而不是返回新列表,则可以在常规的
    for
    循环中执行此操作:

    for i, x in enumerate(data):
        data[i] = (nop, op1, op2)[i % 3](x)
    

    你为什么有
    ::2
    <代码>2::3听起来更像是你想要实现的目标。请注意,切片表示法是
    start:end:step
    ,您可以使用示例列表的示例更好地向其他人解释,并希望基于该列表进行输出。根据我的理解,你已经知道列表切片是如何工作的了。我不理解你提到的问题部分。@Lolgast yep
    2::3
    是缺少的部分,thanks@MoinuddinQuadri的确谢谢你告诉我,我所要做的就是重读我想要达到的目标,看看我已经得到了答案。我熟悉列表理解和
    enumerate()
    ,但以前从未见过这种符号
    (nop,op1,op2)[I%3](x)
    。这叫什么?@Pyderman这种技术被称为“调用者分派”,或者更常见的是“dict分派”(因为在许多有用的情况下,dict倾向于使用,而不是元组)。这里有一篇关于它的帖子:它不是一个真正的特殊符号,只是索引和调用语法的一个稍微不寻常的组合。