2011-12-28 50 views
0

在C#中,存在結構化查詢表達式,使用它,使用集合和數組很有趣。我不確定這個模塊是否存在於python中。然而SQE實現拉姆達,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, 

蟒蛇的解決方案也許緩慢,因爲如果檢查發生太大。

+0

請問每個問題只有一個問題。這使得比較所有的答案成爲可能。你可以簡單地問另一個問題。 – phihag 2011-12-28 10:49:35

回答

3

Python已經內置支持sets

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

注意,套在本質上沒有秩序;您獲得的訂單取決於設置的實施,並且可能會發生變化。在你需要保持秩序極少數情況下,你應該調整你的distinct方法來查找一組(以runtime inO(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的實現是generator的一個例子。這意味着這些值是即時計算的,而不是事先存儲在一個大的列表中。如果您想要一個常規列表(可調整大小的數組),請致電list(如list(distinct(arr))中所述)。

1

我猜你想保持原來的順序,你應該使用一套或者如果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, 
2

要獲得Python中,你可以使用列表的唯一值快速度測試的字典設置():

>>> 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])