我有一个包含有序对的大量列表,我想选择具有相同第一个值的所有嵌套列表。我该怎么办?例如,在下面的代码中,我想要选择所有列出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 :(得分:1)
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]]
答案 1 :(得分:0)
我同意上述评论中的COLDSPEED。
list(filter(lambda x: x[0] == 19, cp2))
是解决这个问题的方法。这非常有效。让我们分解一下这行代码正在做什么。
list(filter(lambda x: x[0] == 19, cp2))
的说明:
list()
:
返回一个列表,其项目与其相同且顺序相同 iterable的项目。 iterable可以是序列,也可以是容器 支持迭代或迭代器对象。
它将filter()
返回的项目作为列表
filter(function, iterable)
:
Sp Python支持函数式编程,这意味着您可以将函数传递给其他函数。
如果iterable
返回true,则filter函数从function
的元素构造一个列表。 iterable
可以是支持迭代的序列或容器,也可以是迭代器。
lambda x: x[0] == 19, cp2
:
这是这行代码的基础。 lambda x: x[0] == 19
是lambda
函数。您可以将其视为lambda arguments: expression
,其中x是lambda argument
,x[0] == 19
是lambda表达式。 filter()
函数会遍历cp2
,cp2
中的每个项目(在您的情况下,项目都是对)都会将lambda function
应用于它。然后lambda function
计算该对上的lambda表达式x[0] == 19
,如果它的计算结果为true,那么lambda function
将返回true filter()
。然后,过滤器函数将此项(对)保留在新构造的列表中。
- 我建议您详细了解lambda
如果您执行该行代码,则会得到以下结果:
>print(list(filter(lambda x: x[0] == 19, cp2)))
[[19, 5], [19, 6], [19, 14], [19, 15]]
希望这有帮助