在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解决方案可能会很慢。
答案 0 :(得分:3)
Python内置了对sets的支持:
arr = range(10) + [2,4,3]
for x in set(arr):
print (x)
请注意,集合本质上没有顺序;您获得的顺序取决于集合的实现,并且可能会发生变化。在极少数情况下您需要保留订单,您应该调整distinct
方法以查找集合(runtime in 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
的实施是generator的一个例子。这意味着这些值是及时计算的,而不是事先存储到大型列表中。如果你想要一个传统的列表(一个可调整大小的数组),请调用list
(如在list(distinct(arr))
中)。
答案 1 :(得分:2)
要在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])
答案 2 :(得分: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,