![](/img/trans.png)
[英]How do I seperate parts of a list into multiple lists, and then put them all together into one big nested list?
[英]How do I select lists that all start with the same value in a big nested list?
我有一个包含有序对的庞大列表,我想选择所有具有相同第一个值的嵌套列表。 我该怎么办? 例如,在下面的代码中,我想选择所有以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)
@coldspeed和@Thomas Kuhn提供了合理的解决方案,为清楚起见,让我们对其进行详细说明,使用您的变量名并将其转换为列表理解:
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]]
我同意以上评论中的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支持函数式编程,这意味着您可以将函数传递给其他函数。
如果该function
返回true,则filter函数根据iterable
的元素构造一个列表。 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
中的每个项目(在您的情况下,该项目为对) 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]]
希望这可以帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.