这个 for 循环代码(带有 `if not in` 条件)可以转换为列表理解吗?

Can this for loop code(with an `if not in` condition) be converted to list comprehension?

如何将此代码转换为列表理解?

pangram = "The quick brown fox jumps over the lazy dog"
lst = []
for char in pangram.casefold():
    if char not in lst:
        lst.append(char)
lst.sort()
print(''.join(lst))

我尝试了以下列表理解,但它不起作用:

lst = [char for char in pangram.casefold if char not in lst]

出现如下错误

NameError: name 'lst' is not defined

请提出解决方案。

可以通过列表理解来破解它,但您必须先预先定义 lst

In [1]: pangram = "The quick brown fox jumps over the lazy dog"                                                         
In [2]: lst = []                                                                                                        
In [3]: [lst.append(char) for char in pangram.casefold() if char not in lst] 
In [5]: lst.sort()                                                                                                      
In [6]: print(''.join(lst))                                                                                             
 abcdefghijklmnopqrstuvwxyz

但是,这确实不是一个好的做法,因为列表理解是为了创建列表,而不是为了改变现有的列表。在此解决方案中,您实际上是在创建 None 的列表,因为 .append() returns None.

如果目标只是获取唯一值 并且 顺序并不重要,请改用 set。 (我认为顺序并不重要,因为你 sort 它之后)。

In [29]: pangram = "aAaabBBbbcCc"                                                                                       

In [30]: lst = list(set(pangram.casefold()))                                                                            
In [31]: lst.sort()                                                                                                     
In [32]: print(''.join(lst))                                                                                            
abc

In [33]: lst = []                                                                                                       
In [34]: [lst.append(char) for char in pangram.casefold() if char not in lst]                                           
Out[34]: [None, None, None]
In [35]: lst.sort()                                                                                                     
In [36]: print(''.join(lst))                                                                                            
abc

不需要列表或理解。使用 set 自动消除重复项。

>>> pangram = "The quick brown fox jumps over the lazy dog"
>>> letters = set(pangram.casefold())  # the unique letters in pangram
>>> ''.join(sorted(letters))
' abcdefghijklmnopqrstuvwxyz'

原则上,for循环可以转换为列表理解。这通过使用第二个 setlist 并利用 lst.append/set.add returns None 来实现,这允许在使用时评估第二个表达式or.

>>> pangram = "The quick brown fox jumps over the lazy dog"
>>> seen = set()
>>> lst = [seen.add(char) or char for char in pangram.casefold() if char not in seen]
>>> lst.sort()
>>> ' abcdefghijklmnopqrstuvwxyz'

一个班轮可能是:

"".join([letter for letter in sorted(set(pangram.casefold()))])