加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读