当前位置: 首页 > 知识库问答 >
问题:

python - 为什么在Python中对集合使用sort()方法会报AttributeError?

萧鸿轩
2025-10-28
cars={'bmw','audi','toyota','soba'}
cars.sort()
print(cars)

File "c:\Users\Lenovo\Desktop\python_work\cars.py", line 2, in <module>

cars.sort()
^^^^^^^^^

AttributeError: 'set' object has no attribute 'sort'


我照着蟒蛇书打的Vscode说有问题

共有2个答案

小牛23464
2025-10-28

{'bmw', 'audi'}这种是定义的集合,['bmw', 'audi']这种定义的是列表(数组)。

集合一般是无序的,只需要保证数据唯一。

小牛25044
2025-10-28

在 Python 中,集合(Set)是无序且不重复的数据结构。它没有定义 sort() 方法,因此当你尝试对一个集合调用 .sort() 时,会抛出 AttributeError

原因分析:

  1. 集合的本质
    {'bmw','audi','toyota','soba'} 是集合(set),不是列表(list)。集合的特点:

    • 元素无序存储
    • 不支持索引访问
    • 没有排序方法(因为它本身不保证顺序)
  2. .sort() 是列表的方法
    只有列表(list)有内置的 sort() 方法。集合和字典等均无此方法。

解决方案:

如果你想排序集合中的元素,需要先将集合转为列表,再排序:

cars = {'bmw','audi','toyota','soba'}
sorted_cars = sorted(cars)  # sorted() 函数返回新列表
print(sorted_cars)          # 输出: ['audi', 'bmw', 'soba', 'toyota']

关键说明:

  • sorted() 函数:适用于任何可迭代对象(包括集合),返回一个新的排序后的列表,不修改原集合。
  • 集合本身不能排序:如果想保留集合的无序性但需要临时获取排序结果,建议使用 sorted()

修正后的代码:

cars = {'bmw', 'audi', 'toyota', 'soba'}
cars_sorted = sorted(cars)  # 正确:通过 sorted() 排序
print(cars_sorted)

常见混淆:

  • 集合使用花括号:{a, b, c}
  • 列表使用方括号:[a, b, c]

如果你需要排序功能,应该直接使用列表而非集合(除非你需要去重+排序):

# 从创建开始就用列表
cars_list = ['bmw', 'audi', 'toyota', 'soba']
cars_list.sort()            # 列表可以直接排序(修改原列表)
print(cars_list)            # 输出: ['audi', 'bmw', 'soba', 'toyota']
 类似资料:
  • 在Python中运行js报错,在js和Python中都打印过相关类型和值了,都没问题,这是怎么回事啊? 报错和异常为: 我首先对参数进行了确认,确认参数为正确格式,且值为正常的。 其次关于编码问题 我在js顶端加了 // @charset "UTF-8"; 在Python中用的

  • 类集合有一些静态方法作为实用工具来操作集合,如List。例如,排序方法(Collections.sort(list))。我不理解为什么Java规范制作了另一个类来承载排序方法(以及所有其他类,如binarySearch),而不列出接口和具体的子类,如ArrayList和LinkedList,来实现这些方法。 已更新 当我做了一个全球性的研究并阅读了这篇文章的答案时,我不得不说(鸟瞰图):一些人(我

  • 问题内容: 我最近一直在使用Python,而我发现有点奇怪的是,广泛使用了“魔术方法”,例如,使其长度可用,一个对象实现一个方法,然后在你写。 我只是想知道为什么对象不能简单地定义一个方法并直接将其作为对象的成员来调用,例如?我敢肯定,Python这么做的确有充分的理由,但是作为一个新手,我还没有弄清楚它们到底是什么。 问题答案: AFAIK在这方面很特殊,并且具有历史渊源。 这是FAQ中的报价:

  • 前面学习了 set 集合,本节来一一学习 set 类型提供的方法。首先,通过 dir(set) 命令可以查看它有哪些方法: >>> dir(set) ['add', 'clear', 'copy', 'difference', 'difference_update', 'discard', 'intersection', 'intersection_update', 'isdisjoint', '

  • 下面是一个我试图从中获取数据的示例网页。http://www.makospearguns.com/product-p/mcffgb.htm xpath取自chrome开发工具,firefox中的firepath也能找到它,但使用lxml它只返回一个空的“文本”列表。 使用 显示数据在那里,但xpath似乎无法找到它。我有什么遗漏吗?我尝试过的大多数其他站点使用lxml和chromedev工具中的x

  • 问题内容: 在阅读OpenStack的代码时,我遇到了这个问题。 名为“服务”的类继承了基类“对象”,然后在Service的方法中调用对象的。相关代码如下: 类定义: 和Service的init方法定义: 并在Service的init中调用super(此处为“对象”): 我不了解上次通话,它实际上是做什么的?有人可以帮忙吗? 问题答案: 简短的答案是object . init ()方法不执行任何操

  • 问题内容: 下面的代码 在Python 2中可以正常工作,但是在Python 3中我得到一个错误: 它仅适用于和。 问题答案: 您需要提供在Python 3订货丰富的比较方法,这是 ,,,,,和。另请参阅:PEP 207-丰富的比较 。 是 不是 不再使用。 更具体地说,以和作为参数,并且需要返回是否小于。例如: (这不是明智的比较实现,但是很难说出您要做什么。) 因此,如果您有以下情况: 这等效

  • 问题内容: 为什么这个简单的Python代码不起作用? 这是我得到的错误: 我已经在几个不同的页面上尝试过,但是我永远无法获得正确执行的方法。 问题答案: 您的代码不是这里的问题。 IE中是否有任何代理设置? 这表示urllib.urlopen的python文档: 在Windows环境中,如果未设置代理环境变量,则将 从注册表的“ Internet设置” 部分获取代理设置。