Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.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 3.x - Fatal编程技术网

Python是否有一个简写符号,用于传递列表的一部分而不复制?

Python是否有一个简写符号,用于传递列表的一部分而不复制?,python,python-3.x,Python,Python 3.x,假设我将下面的伪代码转换为Python。具体地说,关于表示为A的前半部分的参数,Python是否有类似A[1..n/2](我不时看到的另一个伪代码快捷方式)的机制,不需要复制就可以将列表的一部分作为参数传递 Count(array A, length n) if n = 1 return 0 else x = Count(1st half of A, n/2) y = Count(2nd half of A, n/2) return x +

假设我将下面的伪代码转换为Python。具体地说,关于表示为
A
的前半部分的参数,Python是否有类似
A[1..n/2]
(我不时看到的另一个伪代码快捷方式)的机制,不需要复制就可以将列表的一部分作为参数传递

Count(array A, length n)
    if n = 1 return 0
    else
        x = Count(1st half of A, n/2)
        y = Count(2nd half of A, n/2)
    return x + y

如果没有这样的机制,我将根据需要传递索引。

答案是否定的。您将必须传递索引(或
切片
对象)

您还可以编写一个
list
子类,通过将“视图”返回到原始列表而不是副本来处理切片。事实上,我已经解决过几次这个问题,并发现要完全正确很难,但由于您的应用程序不需要负索引、片分配或skip参数,所以变得容易多了。下面是一个快速尝试:

class ListWithAView(list):

    class ListView(object):
        def __init__(self, list, start, stop, step):
            self.list  = list
            self.start = start
            self.stop  = stop
            self.step  = step

        def __iter__(self):
            for i in xrange(self.start, self.stop, self.step):
                yield self.list[i]

        def __len__(self):
            return (self.stop - self.start) / self.step

        def __getitem__(self, i):
            if isinstance(i, slice):
                return type(self)(self.list, (i.start or 0) + self.start,
                                  min(self.start + (i.stop or 0), self.stop),
                                  i.step * self.step if i.step else self.step)
            if isinstance(i, int) and i < len(self):
                return self.list[i+self.start]
            raise IndexError("invalid index: %r" % i)

        def __setitem__(self, i, v):
            if isinstance(i, int):
                self.list[i+self.start] = v
            else:
                raise IndexError("invalid index: %r" % i)

        def __repr__(self):
            return "<slice [%s:%s:%s] of list id 0x%08x>: %s" % (self.start, self.stop, self.step, id(self.list), self)

        def __str__(self):
            return str(list(self))

        __str__ = __repr__

    @property
    def view(self):
        return self.ListView(self, 0, len(self), 1)

您可以在此处使用
切片
对象进行排序,但不幸的是,这里没有
\uu len\uu
方法,因此必须使用
(s.start+s.stop)/2
来计算长度。任何时候,当您明智地“实现”子阵列(当然会创建副本)时,您都可以使用
a[s]

def count(A, s=None):
    if s is None:
        s=slice(0, len(A))
    if s.start + 1  == s.stop:
        return 1
    else:
        x = count(A, slice(s.start, (s.start + s.stop)/2))
        y = count(A, slice((s.start + s.stop)/2, s.stop))
    return x + y

print count([1,2,3,4,5])

在您的示例中,最好的解决方案是按照您的建议传递列表和索引

如果您不需要索引到切片中(例如,如果仅在列表的前半部分和后半部分使用迭代器就足够了),则可以使用
itertools
中的
islice
函数。例如

from itertools import islice
half = (len(sequence) + 1) // 2
first_half = islice(sequence, half):
second_half = islice(sequence, half, len(sequence))

这个函数如何返回除
0
之外的任何内容?我不太关心伪代码b/c,因为它不完整。我省略了部分内容,只关注概念上的
前半部分。@AvinashRaj-尽管它创建了副本,但它是最好的匹配。最后我使用了
A=A[:len(A)//2]的前半部分和
A=A[len(A)//2://code>。谢谢你教我。
from itertools import islice
half = (len(sequence) + 1) // 2
first_half = islice(sequence, half):
second_half = islice(sequence, half, len(sequence))