Python:改进的集合表示法?

Python:改进的集合表示法?,python,set,Python,Set,我在一篇教程中读到,自Python 2.6以来,集合可以这样定义: a_set = {"Members", "of", "set"} 但假设我想用这个符号实现一个_set=setLetters。_set={Letters}在打印时不会呈现相同的输出: >>> set1 = set("Letters") >>> set2 = {"Letters"} >>> print(set1, set2) {'L', 'r', 't', 'e', 's'}

我在一篇教程中读到,自Python 2.6以来,集合可以这样定义:

a_set = {"Members", "of", "set"}
但假设我想用这个符号实现一个_set=setLetters。_set={Letters}在打印时不会呈现相同的输出:

>>> set1 = set("Letters")
>>> set2 = {"Letters"}
>>> print(set1, set2)
{'L', 'r', 't', 'e', 's'} {'Letters'}
教程错了吗?这是怎么回事?如果set2不是一个集合,它是什么?

第一个变量set1从单字符串字母中的字母序列创建一个新集合

第二个变量set2创建一个具有单个str对象的集合。它不会迭代单个字母来创建一个集合。

第一个变量set1从单个字符串字母中的字母序列创建一个新集合


第二个变量set2创建一个具有单个str对象的集合。它不会在单个字母上迭代形成一个集合。

因为在第一个集合中,您传递的是一个iterable。像这样把它放在一个列表中,它会给你你想要的

In [148]: set(["Letters"])
Out[148]: {'Letters'}

因为在第一盘中,你通过了一个可数。像这样把它放在一个列表中,它会给你你想要的

In [148]: set(["Letters"])
Out[148]: {'Letters'}

您从根本上混淆了字面符号和构造函数。所有内置容器的构造函数都采用iterable,并用iterable的元素填充容器。容器文本不是以这种方式工作的,也不是设计为以这种方式工作的。注意,这就是它如何处理支持文字符号的每个内置容器类型:

>>> list('letters')
['l', 'e', 't', 't', 'e', 'r', 's']
>>> ['letters']
['letters']
>>>

所以这并不奇怪。

您从根本上混淆了文字符号和构造函数。所有内置容器的构造函数都采用iterable,并用iterable的元素填充容器。容器文本不是以这种方式工作的,也不是设计为以这种方式工作的。注意,这就是它如何处理支持文字符号的每个内置容器类型:

>>> list('letters')
['l', 'e', 't', 't', 'e', 'r', 's']
>>> ['letters']
['letters']
>>>

所以这并不奇怪。

谢谢。使用{}-符号可以实现set1吗?@Sandi不太可能。除非你想破解CPython的源代码。有什么原因不能使用set吗?{*'letters}适用于Python3.6。不过我没有在2.x上试过。没有理由,我只是好奇而已。谢谢你,艾翰!这背后的逻辑是什么?星号“否”代表什么?@Sandi它打开了一个iterable。假设您有一个列表a=['x','y'],通常,如果您使用funca调用函数,则该列表将作为输入传递。但是如果你做了func*a,它的工作原理就像你做的func'x',y'是更多的细节。谢谢。使用{}-符号可以实现set1吗?@Sandi不太可能。除非你想破解CPython的源代码。有什么原因不能使用set吗?{*'letters}适用于Python3.6。不过我没有在2.x上试过。没有理由,我只是好奇而已。谢谢你,艾翰!这背后的逻辑是什么?星号“否”代表什么?@Sandi它打开了一个iterable。假设您有一个列表a=['x','y'],通常,如果您使用funca调用函数,则该列表将作为输入传递。但是如果你做func*a,它的工作原理就像你做func'x',y'是更多的细节。