2017-07-14 31 views
0

我有一个充满有序对的巨大列表,我想选择所有具有相同第一个值的嵌套列表。我会怎么做?例如,在下面的代码中,我想选择所有具有19作为第一个值的列表。如何选择所有以大嵌套列表中的相同值开头的列表?

import numpy as np 

radius = 10 
origin=(10,10) 

def circle(radius): #init vars 
    switch = 3 - (2 * radius) 
    points = set() 
    x = 0 
    y = radius 
    while x <= y: #first octant starts clockwise at 12 o'clock 
     points.add((x,-y)) #1st oct 
     points.add((y,-x)) #2nd oct 
     points.add((y,x)) #3rd oct 
     points.add((x,y)) #4th oct 
     points.add((-x,y)) #5th oct 
     points.add((-y,x)) #6th oct 
     points.add((-y,-x)) #7th oct 
     points.add((-x,-y)) #8th oct 
     if switch < 0: 
      switch=switch+(4*x)+6 
     else: 
      switch=switch+(4*(x-y))+10 
      y=y-1 
     x=x+1 
    return points 

cp = list(circle(radius)) 
cp1=np.array(cp) 
center=list(origin) 
cp1=cp1+center 
cp2=cp1.tolist() 
cp2.sort() 
desmos=list(tuple(x) for x in cp2) 

print(cp2) 
+0

'名单(过滤器(lambda x:x [0] == 19,nestedList))' –

+1

'[x for nestedList if x [0] == 19]' –

回答

1

@coldspeed和@Thomas库恩提供合理的解决方案,让我们对他们的详细说明为清楚起见,用你的变量名并将其转换为一个列表理解:

value_19 = [item for item in cp2 if item[0] == 19] 

这是什么呢?:

列表解析是生成通常包含已过滤项目或来自相关列表或数据源的已转换项目的列表的机制。列表理解针对性能进行了高度优化,一旦您习惯了它们,便于阅读。

从本质上说,上面的列表理解确实在一个单一的线这四样东西:

value_19 = list() 
for item in cp2: 
    if item[0] == 19: 
     value_19.append(item) 

在这种情况下,您的CP2,输出结果。

[[0, 7], [0, 8], [0, 9], [0, 10], [0, 11], [0, 12], [0, 13], [1, 5], 
[1, 6], [1, 14], [1, 15], [2, 4], [2, 16], [3, 3], [3, 17], [4, 2], 
[4, 18], [5, 1], [5, 19], [6, 1], [6, 19], [7, 0], [7, 20], [8, 0], 
[8, 20], [9, 0], [9, 20], [10, 0], [10, 20], [11, 0], [11, 20], 
[12, 0], [12, 20], [13, 0], [13, 20], [14, 1], [14, 19], [15, 1], 
[15, 19], [16, 2], [16, 18], [17, 3], [17, 17], [18, 4], [18, 16], 
[19, 5], [19, 6], [19, 14], [19, 15], [20, 7], [20, 8], [20, 9], 
[20, 10], [20, 11], [20, 12], [20, 13]] 

而且从上面的代码:

value_19 = [item for item in cp2 if item[0] == 19] 

会产生这样的结果:

[[19, 5], [19, 6], [19, 14], [19, 15]] 
+0

哇,这太棒了!谢谢,从初学者。 – rb12345

+0

很好解释。 –

+0

@ rb12345如果答案看起来合理和合适,请随时接受。 =) –

0

我COLDSPEED同意上述评论。

list(filter(lambda x: x[0] == 19, cp2))是我如何解决这个问题的方法。这非常有效。让我们来分析一下这行代码在做什么。

list(filter(lambda x: x[0] == 19, cp2))说明:

list()

返回一个列表,其项目是相同的,在相同的顺序 迭代的项目。可迭代可以是序列,支持迭代的容器或迭代器对象。

它返回由filter()作为一个列表

filter(function, iterable)返回的项目:

SP Python支持函数式编程,这意味着你可以通过功能等功能。

如果function返回true,则过滤器函数会构造iterable元素的列表。 iterable可以是支持迭代的序列或容器,也可以是迭代器。

lambda x: x[0] == 19, cp2

这是这行代码的面包和奶油。lambda x: x[0] == 19lambda函数。你可以看到它为lambda arguments: expression其中x是lambda argumentx[0] == 19是lambda表达式。 filter()函数遍历cp2,对于cp2中的每个项目(在您的情况下该项目是该对),将lambda function应用于它。然后lambda function评估对上的lambda表达式x[0] == 19,如果它评估为真,则lambda function返回至filter()。然后过滤器函数将把这个项目(对)保存在新构建的列表中。

- 我建议你了解lambda

FF您执行代码行,你得到的结果:

>print(list(filter(lambda x: x[0] == 19, cp2))) 
[[19, 5], [19, 6], [19, 14], [19, 15]] 

希望这有助于

相关问题