代码之家  ›  专栏  ›  技术社区  ›  Amin Ba

使用列表理解而不是通常的for循环[duplicate]从重复成员中删除列表

  •  -1
  • Amin Ba  · 技术社区  · 6 年前

    这个问题已经有了答案:

    我已经知道,如果我想创建一个列表,我可以使用所谓的列表理解使Python for for循环变短。例如,不要写:

    b = []
    a = [2, 3, 5]
    for x in a:
        b.append(x**2)
    

    我可以这样写我的代码:

    b = [x**2 for x in a]
    

    我想知道如何将下面的代码转换为第二个更短格式:

    lst = [1, 2, 3, 3, 4, 5, 5]
    u_lst = []
    for x in lst:
        if x not in u_lst:
            u_lst.append(x)
    
    2 回复  |  直到 6 年前
        1
  •  0
  •   blhsing    6 年前

    正如@pritoshsingh在评论中指出的那样,一个包含对已经在同一个列表中构造的项的引用的列表构造不适合使用列表理解,它最适合于值映射和/或基于不涉及正在构造的列表本身的条件进行筛选。

    你所描述的问题可以通过使用 dict.from_keys 方法,它忽略它已经具有的项。 看到 从给定序列中读取:

    u_list = list(dict.from_keys(lst))
    

    使用 collections.OrderedDict 代替 dict 如果您使用的是Python3.6或更早版本,则无法保证dict键的顺序。

        2
  •  0
  •   Ernxst    6 年前

    从你想要的具体例子来看 u_lst 仅作为唯一值的列表。如果是,则不需要任何列表理解,只需使用 set 在原始列表中:

    lst = [1, 2, 3, 3, 4, 5, 5]
    u_lst = list(set(lst))
    

    输出 {1, 2, 3, 4, 5} 不转换成列表 [1, 2, 3, 4, 5] 有了它。

    注意使用 设置 在一个列表上产生一个集合,为了使它表现为一个列表,然后将其转换为一个列表,如上所述。