<h2>简化</h2>
<pre><code>requestId=[123, 456, 789, 987, 654, 321]
requestTitle=['Title1', 'Title1', 'Title2', 'Title3', 'Title3', 'Title3']
requestBodyText=['BodyText1', 'BodyText1', 'BodyText2', 'BodyText3', 'BodyText3', 'BodyText3']
</code></pre>
<p>我们将使值变小,以便在屏幕上显示它们,同时保留关系:</p>
<pre><code>index = [1, 2, 3, 4, 5, 6]
lower = ['a', 'a', 'b', 'c', 'c', 'c']
upper = ['A', 'A', 'B', 'C', 'C', 'C']
</code></pre>
<p>您需要一个函数,它接受这三个列表并为您提供</p>
<pre><code>uniq = [1, 4, 4]
dups = [2, 5, 6]
</code></pre>
<p>我们已经看到了一个小问题-您是否只希望第一个问题被认为是唯一的?为什么1是唯一的而不是2?一种更通用的方法是根据唯一性将它们分组,然后决定如何处理所有组(例如,选择第一个)</p>
<p>我们将忽略任何有关请求的内容,因为这与您的问题无关</p>
<h2>解决方案</h2>
<p>您所请求的只是一个简单的分组,我们可以使用dict,将唯一部分作为键:</p>
<pre><code>from collections import defaultdict
groups = defaultdict(list) # Could be set, but you want order it seems
for i, low, up in zip(index, lower, upper): # Gives us (1, 'a', 'A'), (2, ...), ...
groups[(low, up)].append(i)
</code></pre>
<p>我们现在有了按唯一性约束分组的ID</p>
<pre><code>>>> dict(groups)
{('a', 'A'): [1, 2], ('b', 'B'): [3], ('c', 'C'): [4, 5, 6]}
</code></pre>
<p>由于您希望一个列表中的第一个列表和另一个列表中的其他列表,我们可以提取它们:</p>
<pre><code>uniq = []
dups = []
for vals in groups.values():
for dup in vals[1:]:
uniq.append(vals[0])
dups.append(dup)
</code></pre>
<p>瞧</p>
<pre><code>>>> uniq
[1, 4, 4]
>>> dups
[2, 5, 6]
</code></pre>
<p>请注意,我们将放弃上述内容,因为这只是您实际需要(我们已经有了)的中间步骤:</p>
<pre><code>for vals in groups.values():
first = vals[0]
for dup in vals[1:]:
mark_as_duplicate(first, dup) # Where this is your api logic
</code></pre>
<hr/>
<p>根据评论中的后续问题:</p>
<p>您正在生成一些json以发送到您的请求,如下所示</p>
<pre><code>for first, one_of_rest in zip(stuff):
body = {'requestId': first, "addRelatedEmails": [{"id": one_of_rest, "name": "EMAIL"}]}
<do api stuff>
</code></pre>
<p>你应该这样做</p>
<pre><code>for vals in groups.values():
first = vals[0]
rest = vals[1:]
if rest:
related = [{"id": item, "name": "EMAIL"} for item in rest]
body = {'requestId': first, "addRelatedEmails": related}
<do api stuff>
</code></pre>