Python编程,编写自己的函数或查找内置函数的困难



在c#中,存在结构化查询表达式,有了它,使用集合和数组很有趣。我不确定python中是否存在这样的模块。然而SQE实现了lambda, lambda表达式也存在于python中:

假设我只需要从集合中获取不同的值:

c# ex: 
List<int> arr = new List<int> {0,1,2,3,4,5,6,7,8,9};
            List<int> arr2 = new List<int> { 2, 3, 4 };
            arr.AddRange(arr2);
            var qry = arr.Distinct();
            foreach (var x in qry)
                Console.WriteLine(x);
python ex:
arr = range(10) + [2,4,3]
def distinct(x):
    arr2 = []
    for y in x:
        if not y in arr2:
            arr2.append(y)
    return arr2
for x in distinct(arr):
    print x,

python的解决方案可能很慢,如果检查发生太多

Python内置了set支持:

arr = range(10) + [2,4,3]
for x in set(arr):
    print (x)

注意集合本质上是没有顺序的;您获得的顺序取决于set的实现,并且可能会更改。在极少数情况下,您需要保持顺序,您应该调整您的distinct方法来查找一个集合(运行时在O(log n)中,甚至在O(1)中平摊),而不是列表(O(n)),如下所示:

def distinct(iterable):
    seen = set()
    for el in iterable:
        if el not in seen:
            seen.add(el)
            yield el
for x in distinct(arr):
    print (x)
顺便说一下,distinct的实现是一个生成器的例子。这意味着值是即时计算的,而不是预先存储到一个大列表中。如果你想要一个传统的列表(一个可调整大小的数组),调用list(和list(distinct(arr))一样)。

要在Python中获取列表的唯一值,可以使用set():

>>> lst = range(10) + [2,4,3]
>>> lst
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 2, 4, 3]
>>> set(lst)
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

我猜你想保持原来的顺序,你应该使用一个集合或字典快速测试,如果y已经列出

arr = range(10) + [2,4,3]
def distinct(x):
    ToRet = []
    AuxDict = {}
    for y in x:
        if y not in AuxDict:
            AuxDict[y] = 0
            ToRet.append(y)
   return ToRet
for x in distinct(arr):
    print x,

相关内容

最新更新