如何在大嵌套列表中选择所有以相同值开头的列表?

时间:2017-07-14 15:34:00

标签: python list python-3.x nested-lists

我有一个包含有序对的大量列表,我想选择具有相同第一个值的所有嵌套列表。我该怎么办?例如,在下面的代码中,我想要选择所有列出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)

2 个答案:

答案 0 :(得分:1)

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

答案 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] == 19lambda函数。您可以将其视为lambda arguments: expression,其中x是lambda argumentx[0] == 19是lambda表达式。 filter()函数会遍历cp2cp2中的每个项目(在您的情况下,项目都是对)都会将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]]

希望这有帮助