<p>我不同意以名单中的职位和“优先”成员来代表优先权的想法。这是多余的,<em>会在某一点上造成故障</p>
<p>此外,我必须作出假设来回答这个问题,因为这个问题并不完整</p>
<p>假设:</p>
<ul>
<li>最后,列表应该再次按优先级排序</li>
<li>优先级最终应该是整数</li>
<li>优先级始终从1开始,并在列表中不留空白</li>
</ul>
<hr/>
<h2>第一种方法</h2>
<p>使用<em>halfs</em>精确指定要放置项目的位置。这很简单,其他一切都应该到位</p>
<h2>范例</h2>
<p>任务:将<code>234</code>移动到优先级<code>3</code></p>
<p>遗憾的是,这并不是唯一的定义,因为不清楚旧的优先项目<code>3</code>应该转移到哪里</p>
<p>而是将其移动到priority<code>3.5</code>以使其明确,然后重新排序并重新枚举:</p>
<pre><code># Change priority of '234' to '3.5'
my_dict[1]["priority"] = 3.5
# Sort
my_dict.sort(key=lambda x: x["priority"])
# Re-enumerate
for (position, item) in enumerate(my_dict):
item["priority"] = position + 1
print(my_dict)
</code></pre>
<pre><code>[{'id': 123, 'priority': 1}, {'id': 345, 'priority': 2}, {'id': 234, 'priority': 3}, {'id': 654, 'priority': 4}]
</code></pre>
<hr/>
<p>但对于大型数据集,这确实很慢,因为每个优先级更改都是O(n*log(n)),因为它需要排序</p>
<p>您应该研究更好的数据结构,如堆或链表,这取决于您的确切使用场景</p>
<hr/>
<h2>第二种方法</h2>
<p>如果我们删除<code>'priority'</code>成员,我们可以编写一个更高效的算法:</p>
<pre><code>def move(data, original, target):
data.insert(target, data.pop(original))
# Important: Start priorities at 0, not 1. This makes this a lot easier.
my_dict = [123, 234, 345, 654]
move(my_dict, 3, 0)
print(my_dict)
my_dict = [123, 234, 345, 654]
move(my_dict, 1, 2)
print(my_dict)
</code></pre>
<pre><code>[654, 123, 234, 345]
[123, 345, 234, 654]
</code></pre>
<p><a href="https://ideone.com/o9UcCb" rel="nofollow noreferrer">https://ideone.com/o9UcCb</a></p>
<p>有关如何在列表中移动项目的详细讨论,请阅读<a href="https://stackoverflow.com/questions/3173154/move-an-item-inside-a-list">this discussion</a></p>