这两段代码给出了两个不同的结果!为什么呢?
len(sorted(set([w.lower() for w in text1])))
17231
len(sorted([w.lower() for w in set(text1)]))
19317
答案 0 :(得分:2)
由于字符的低位和高位形式不具有相同的hash value,因此set函数不会将它们视为重复。因此,在将所有字符转换为小写字母后,set()
函数将在第一个代码中从字符串中删除更多字符。
考虑以下示例:
>>> text2 = 'ABCDEFabcdef'
>>>
>>> set(w.lower() for w in text2)
set(['a', 'c', 'b', 'e', 'd', 'f'])
>>> [w.lower() for w in set(text2)]
['a', 'a', 'c', 'b', 'e', 'd', 'f', 'f', 'c', 'b', 'e', 'd']
您可以使用hash()
函数查看字符的哈希值:
>>> hash('A')
8320025024
>>> hash('a')
12416037344
再多一点:
现在,如果您想获得较低字符的独特结果,您应该使用第一种方法。但是如果你正在处理一个大文本,你最好使用生成器表达式而不是列表理解:
set(w.lower() for w in text1))
答案 1 :(得分:0)
>>> text1 = 'Aa'
>>> set(text1) # has two elements because the input has two different elements
{'a', 'A'}
>>> [w.lower() for w in set(text1)]
['a', 'a']
>>> [w.lower() for w in text1]
['a', 'a']
>>> set([w.lower() for w in text1]) # has one element because the input has two equal elements
{'a'}
答案 2 :(得分:0)
第一个版本将所有字符串转换为小写,然后删除重复项,然后排序。第二个版本删除重复项,然后转换为小写,然后排序。
因此,对于每个仅在大小写上不同的输入字符串对,第二个版本将发出匹配的两个(小写)条目。
您是否看到其他差异?
修改:您已将代码更改为仅生成结果列表的len()
,因此您将看不到详细信息。尝试区分列表。