循环播放集时删除一些项目

时间:2014-11-07 18:32:05

标签: python loops set

我想要类似的东西:

for node_a in A_nodes:
    a_pos = A.node[node_a]['pos']
    link_len = math.sqrt((a_pos[0]-a_base_pos[0])**2+(b_pos[1]-b_base_pos[1])**2)
    if link_len < th:
        A_nodes.remove(node_a)

如何满足我的要求?

3 个答案:

答案 0 :(得分:4)

你可以这样试试,

myset = { item for item in myset if item<tr}

或者,

new_set = {}
for item in myset:
   if item < tr:
      new_set.add(item)

myset = new_set

答案 1 :(得分:2)

您可以使用set.intersectionrange

>>> tr = 5
>>> myset = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
>>> myset.intersection(range(tr + 1))
{1, 2, 3, 4, 5}
>>> myset & set(range(tr + 1))
{1, 2, 3, 4, 5}
>>>

如您所见,删除了大于tr的所有内容。

答案 2 :(得分:1)

您将遇到的问题是,在迭代它时,您无法修改集合,因此您需要过滤并重新分配给my_set。有很多方法可以做到这一点。

示例1:理解

my_set = {item for item in myset if item < tr }

示例2:过滤

def my_filter(item):
    item < tr

my_set = filter(my_filter, my_set)

示例2a:使用lambda 过滤

my_set = filter(lambda x: x < tr, my_set)

示例3:For循环

new_set = {}
for item in my_set:
    if item < tr:
        new_set.add(item)
my_set = new_set

因此,如果我们将2A应用于您的代码,大致是因为您没有显示很多变量定义:

def calc_len(node):
    #return the length here using your calculation

A_nodes = filter(lambda x: calc_len(x) < th, A_nodes)