【问题标题】:Python set difference of stringsPython设置字符串的差异
【发布时间】:2019-10-09 18:59:03
【问题描述】:

我在 Python 中创建不同的字符串集时遇到了以下特殊行为:

set(['a', 'b']) - set(['a'])   # results in {'b'} as expected
set(['a', 'b']) - set('a')     # results in {'b'} as expected
set(['a.', 'b']) - set(['a.']) # results in {'b'} as expected
set(['a.', 'b']) - set('a.')   # surprisingly results in {'a.', 'b'}!

为什么在最后一种情况下是 'a.'是不是从集合中减去?由于第二种和第四种情况之间的区别是点,我认为这是罪魁祸首。使用双引号会产生相同的行为。

【问题讨论】:

  • set('a.') = {'.', 'a'},所以我不确定我是否会称这种行为令人惊讶
  • 你看到set('a.')是什么了吗?这是带有字符串 'a''.' 的集合

标签: python string set set-difference


【解决方案1】:

您的最后一组被解释为{'a', '.'}。所以你的set操作不会排除'a.'

这是因为set会遍历输入,而对字符串的迭代是char。

【讨论】:

  • 你能告诉我为什么它会被这样解释吗?来自 Scala 似乎违反直觉。
  • @bugfoot for x in 'abc' 因此正在读取字符 a, b, c。而对于['abc'] 的列表则不同,因为只有一项。
  • 它将可迭代的内容变成一个集合。如果迭代是一个列表,它会从列表中的每个元素创建一个集合。这同样适用于字符串@bugfoot
  • 所以它不是点,而是任何多字符串...相应地修改了标题。
  • @bugfoot 您可以打开一个 REPL 并输入 set('abc') 以帮助更好地理解。
【解决方案2】:

set('a.') 将字符串解释为字符列表['a','.],从而得到{'.', 'a'}

set(['a.', 'b']) 将列表解释为['a.', 'b'],从而得到{'a.', 'b'}

现在当你取集合差时,结果是{'a.', 'b'},因为第一组和第二组的集合差是第一组本身,因为这两个集合中没有共同的元素。

来自文档:https://docs.python.org/3/library/stdtypes.html#set-types-set-frozenset

差异(*其他)。设置 - 其他 - ...
返回一个新集合,该集合中的元素不在其他集合中。

下面的行为可以更清楚地看到

In [1]: set('a.')                                                                                                                                                                   
Out[1]: {'.', 'a'}

In [2]: set(['a.', 'b'])                                                                                                                                                            
Out[2]: {'a.', 'b'}

In [3]: set(['a.', 'b']) -  set('a.')                                                                                                                                               
Out[3]: {'a.', 'b'}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-17
    • 1970-01-01
    • 1970-01-01
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多