python – 访问列表理解生成的列表
发布时间:2020-12-20 11:33:04 所属栏目:Python 来源:网络整理
导读:参见英文答案 Recursive list comprehension in Python?????????????????????????????????????6个 所以这里有一个简单的例子,可能更好地执行其他方式. 这是常规的for-loop版本: lst1 = ['abc','abc','cde','cde']lst2 = []for i in lst1: if i not in lst2:
参见英文答案 >
Recursive list comprehension in Python?????????????????????????????????????6个
所以这里有一个简单的例子,可能更好地执行其他方式. 这是常规的for-loop版本: lst1 = ['abc','abc','cde','cde'] lst2 = [] for i in lst1: if i not in lst2: lst2.append(i) 和非工作列表理解近似: lst2 = [i for i in lst1 if i not in lst2] # NameError: name 'lst2' is not defined 所以问题是:是否可以访问由列表理解产生的列表,就像它正在制作一样? 解决方法
TL; DR:没有简单的方法来进行递归列表理解.
为什么?这是因为当解释器到达这一行时,它将首先评估操作的右侧(列表理解)并尝试构造列表.在构造之后,它将影响为lst2创建的列表.但是,当您尝试构建列表时,您正在调用尚未定义的lst2. 您可以查看生成的字节码: >>> def test(lst1): ... lst2 = [i for i in lst1 if i not in lst2] ... >>> dis.dis(test) 2 0 BUILD_LIST 0 3 LOAD_FAST 0 (lst1) 6 GET_ITER >> 7 FOR_ITER 24 (to 34) # the list comprehension is converted into a for loop 10 STORE_FAST 1 (i) 13 LOAD_FAST 1 (i) 16 LOAD_FAST 2 (lst2) # try to load lst2,which doesn't exist yet 19 COMPARE_OP 7 (not in) 22 POP_JUMP_IF_FALSE 7 25 LOAD_FAST 1 (i) 28 LIST_APPEND 2 31 JUMP_ABSOLUTE 7 >> 34 STORE_FAST 2 (lst2) 37 LOAD_CONST 0 (None) 40 RETURN_VALUE 解决方案:您要做的是定义一个集合: >>> lst1 = ['abc','cde'] >>> set(lst1) set(['cde','abc']) (我希望你对元素的顺序无关紧要:-))如果顺序很重要: >>> tmp = set() # create a set of already added elements >>> [x for x in lst1 if x not in tmp and not tmp.add(x)] ['abc','cde'] (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |