Python 在循环集合时删除某些项
我想要像这样的东西:Python 在循环集合时删除某些项,python,loops,set,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) 如何满足我的要求?你可以这样试试 myset = { item for item in
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)
如何满足我的要求?你可以这样试试
myset = { item for item in myset if item<tr}
或者
您可以使用和:
正如您所看到的,所有大于tr的内容都将被删除。这样做的问题是,在对集合进行迭代时,您无法在适当的位置修改集合,因此您需要进行筛选并重新分配到my_集合。有很多方法可以做到这一点 例1:理解 示例2:过滤器 示例2a:带lambda的过滤器 示例3:For循环 因此,如果我们将2A应用于您的代码,大概是因为您没有显示太多变量定义:
def calc_len(node):
#return the length here using your calculation
A_nodes = filter(lambda x: calc_len(x) < th, A_nodes)
这是一个列表,不是一个集合。顺便说一句,如果if块中有很多行,那么列表理解可能不是一个好主意{item for item in myset if item您可以用生成器表达式替换列表理解,即去掉方括号。set不需要列表,只需要一个iterable。问题是if块中有许多行,而不仅仅是item编辑您的问题,以显示if块中许多行的含义。谁否决了我的问题?为什么e函数将返回???@iCodez回答者要求我更改它,以便详细说明。。。
>>> 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}
>>>
my_set = {item for item in myset if item < tr }
def my_filter(item):
item < tr
my_set = filter(my_filter, my_set)
my_set = filter(lambda x: x < tr, my_set)
new_set = {}
for item in my_set:
if item < tr:
new_set.add(item)
my_set = new_set
def calc_len(node):
#return the length here using your calculation
A_nodes = filter(lambda x: calc_len(x) < th, A_nodes)