python - 设置字符串、循环之前和循环之后的不同行为

标签 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

最佳答案

由于字符的大写形式不同 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))

关于python - 设置字符串、循环之前和循环之后的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36955643/

相关文章:

javascript - 字符串操作,将 ""替换为(空格)

java - java 中 rtrim 与 StringBuilder 的等价物

python - 如何用单个元素替换字符串中的多个元素?

Python 在运行时将类添加到 __mro__

python - 记忆化问题 - 房屋强盗问题

python - 我的 yticks 在 matplotlib 中重叠

python - 如果 Python 中的条件为真,则跳过一段代码

python - Pygame 的当前 GUI 选项

ios - 不需要的信息显示在 NSString 的文本标签中

python - 关于 python 3.3 的对齐数字