Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我怎样才能让这个泡泡更像蟒蛇?_Python_Bubble Sort_Python 3.9 - Fatal编程技术网

Python 我怎样才能让这个泡泡更像蟒蛇?

Python 我怎样才能让这个泡泡更像蟒蛇?,python,bubble-sort,python-3.9,Python,Bubble Sort,Python 3.9,我有以下代码: Sorted=False while not Sorted: Sorted=True for x,y in enumerate(List[:-1]): if List[x]>List[x+1]: List[x],List[x+1]=List[x+1],List[x] Sorted=False 然而,使用 Sorted=True/False 重复是非常难看的,编写类似以下内容的代码会更好: w

我有以下代码:

Sorted=False
while not Sorted:
    Sorted=True
    for x,y in enumerate(List[:-1]):
        if List[x]>List[x+1]:
            List[x],List[x+1]=List[x+1],List[x]
            Sorted=False
然而,使用

Sorted=True/False
重复是非常难看的,编写类似以下内容的代码会更好:

while True:
    for x,y in enumerate(List[:-1]):
        if List[x]>List[x+1]:
            List[x],List[x+1]=List[x+1],List[x]
            break
    else:break
唯一的问题是,如此早地中断循环会导致循环重复多次,从而占用更多的时间。有没有办法让代码更具python风格,或者我只需要让它保持丑陋

  • 您的第二个版本不是冒泡排序

  • 我只需要将循环更改为

      for idx in range(len(List)-1):
         if List[idx]>List[idx+1]:
             List[idx],List[idx+1] = List[idx+1],List[idx]
             Sorted=False
    

  • 我不认为有更好的方法来构造这个pythonical。我可以根据建议提出一些格式问题,这将使您的代码更易于阅读:

    • snake_case
      变量(无大写字母)
    • 赋值中
      =
      周围的空格,逗号后,通常围绕比较
    此外,我同意for循环可以简单地使用
    range(len(…)
    。考虑到这些因素(然后避免产生的保留关键字,
    排序
    列表
    ):

    done\u排序=False
    未完成排序时:
    完成排序=真
    对于范围内的i(len(lst-1)):
    如果lst[i]>lst[i+1]:
    lst[i],lst[i+1]=lst[i+1],lst[i]
    完成排序=错误
    
    现在,在Python中,这通常是一种传统的智慧。正如Trey Hunner在那篇文章中得出的结论:

    如果您发现自己试图使用
    范围(len(my_list))
    或循环计数器,请考虑是否可以重新定义问题,以允许使用
    zip
    枚举
    (或两者的组合)

    事实上,如果您发现自己正在使用
    枚举
    ,请考虑是否确实需要索引。Python中很少需要索引

    然而,这在很大程度上是因为Python的数组(双关语)内置了用于迭代和排序的工具。如果您想纯粹将列表排序作为一个实际问题,那么可以使用
    sorted()
    .sort()
    ,而不是作为练习实现自己的冒泡排序。在这种情况下,有意使用较低级别的细节,直接使用索引是有意义的

    只是为了好玩。。。如果您真的想以更“正常的Pythonic”的方式进行此操作,它可能看起来像这样:

    done\u排序=False
    未完成排序时:
    完成排序=真
    对于zip中的(i,first)、(j,second)(枚举(lst[:-1]),枚举(lst[1:]):
    如果第一次>第二次:
    lst[i],lst[j]=第二,第一
    完成排序=错误
    
    我不认为有人会认为这会提高可读性


    另外,它对于气泡排序没有用处,因为它不提供索引访问权限,但是您可能想了解的相关信息是
    成对
    函数。在列表中的连续重叠对上循环非常方便:

    成对排列的第一个、第二个(lst):
    
    它将作为一个组件包含在Python 3.10中,但您也可以在早期版本中使用它:

    • 它包含在可安装的软件包中
    • 这些文档包括一个自己实现的现成文档

    最好询问一下,使用布尔标志并不会使您的代码不和谐,有时这是表达您意图的最佳方式。对于这段代码,我想到的是大写的变量名,运算符周围没有空格,使用“List”作为变量:)