python - 尝试排序时的无限循环,在 Python 中随机打破关系
问题描述
我有一个属性包含整数的对象列表。我正在尝试编写一个程序,该程序将根据该整数(从高值到低值)对它们进行排序,如果有任何关系,则随机打乱对象。(可以把它想象成抛硬币打破平局,但我希望它能够工作,即使有三个或更多平局。)
这是我编写的一些示例代码,它复制了我正在尝试对整数列表执行的操作。(当然,具有相同值的整数之间没有实际区别,但在实际程序中,对象具有其他属性。)
import random as R
array = [25, 45, 10, 25, 15, 25]
sortedarray = sorted(array, reverse=True)
newarray = []
while len(sortedarray) > 1:
if sortedarray[0] == sortedarray[1]:
newarray.append(sortedarray.pop(0))
else:
challenge = sortedarray[0]
samevalue = []
while sortedarray[0] == challenge:
samevalue.append(sortedarray.pop(0))
while len(samevalue) > 0:
sortedarray.append(samevalue.pop(R.randrange(len(samevalue))))
我的想法是:对列表进行排序,然后检查第一个值和第二个值是否相等。如果没有,这意味着还没有平局,所以pop()
第一个值和append()
它到newarray
. 如果它们相等,则意味着存在平局,因此pop()
具有该值的所有项目都进入 list samevalue
,而pop()
那些项目newarray
是随机的。
我遇到了一个无限循环,但我不知道为什么。我肯定会很感激一些见解,无论是关于我为什么要循环还是如何更有效地做到这一点!
解决方案
首先使用该方法将列表改组为随机顺序shuffle
,然后对其进行排序。这样,关系就已经是随机顺序了。
推荐阅读
- docker - Docker - 从私有网络访问主机
- python - Python 进程 TypeError: no default __reduce__ due to non-trivial __cinit__
- apache-spark - 分配最大 spark.driver.memory
- javascript - Angular12 中的兄弟组件如何监听彼此的事件?
- python - 有没有办法用 Selenium 提取 CSS 选择器?
- java - 将应用程序构建到 jar 后资源未加载
- python - 在括号中切换多行或单行 Vim
- regex - 正则表达式匹配第二行中一组数字中的第二个数字
- composite - Geode Native Client 复合键
- python - 向 JSON 文件添加多个参数