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

Python 使用列表理解而不是通常的for循环从重复成员中删除列表,python,for-loop,list-comprehension,Python,For Loop,List Comprehension,我已经了解到,如果我想创建一个列表,我可以使用所谓的列表理解来缩短python的“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:

我已经了解到,如果我想创建一个列表,我可以使用所谓的列表理解来缩短python的“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)

正如@Pritossingh在评论中指出的,涉及到同一列表中已经构建的项目的列表构建不适合使用列表理解,它最适合基于不涉及正在构建的列表本身的条件进行值映射和/或过滤

使用
dict.from_keys
方法可以最好地解决您描述的问题,该方法在读取给定序列时忽略已看到的项目:

u_list = list(dict.from_keys(lst))

如果您使用的是Python 3.6或更早版本,其中dict键的顺序无法保证,请使用
collections.OrderedDict
代替
dict

从给出的特定示例来看,您似乎只希望
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]


请注意,在列表上使用
set
会生成一个集合,为了使其表现为列表,您可以如上所述将其转换为列表。

并非所有循环都可以以有意义的方式转换为列表理解。当您需要在列表中“映射/处理每个值”,或在列表中“根据独立条件过滤/选择特定项”或其组合时,列表理解最适合。当您希望将列表创建为输出时,列表理解最适合。在这里,您正在构建的列表本身就包含在条件中。这并不能解决清楚的理解问题,正常的循环在这里可能更有意义。