字符串,循环之前和循环之后的不同行为

时间:2016-04-30 13:42:42

标签: python string python-3.x set

这两段代码给出了两个不同的结果!为什么呢?

len(sorted(set([w.lower() for w in text1])))
17231

len(sorted([w.lower() for w in set(text1)]))
19317

3 个答案:

答案 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(),因此您将看不到详细信息。尝试区分列表。