<p>虽然还有其他更整洁的解决方案,但我的有点不同。
其他的只取最小值和最大值,这意味着如果您输入:</p>
<p><code>minify(['1/1/1','1/1/900'])</code></p>
<p>您将获得:</p>
<p><code>['1/1/1-900']</code></p>
<p>这可能不是你想要的。你知道吗</p>
<p>当两个端口之间的距离超过1时,我的函数将创建一个新组:</p>
<p><code>['1/1/1', '1/1/900']</code></p>
<pre class="lang-py prettyprint-override"><code>def minify(ports):
ports.sort()
heads = []
tails = []
for port in ports:
s = port.split('/')
heads.append('/'.join(s[:-1]))
tails.append(s[-1])
combined = zip(heads, tails)
d = {}
for i, port in enumerate(combined):
if port[0] not in d:
d[port[0]] = [int(port[1])]
else:
d[port[0]].append(int(port[1]))
for _, typus in d.items():
typus.sort()
print(d)
d_groups = {}
for head, tails in d.items():
d_groups[head] = []
for tail in tails:
tail = int(tail)
in_group = False
for group in d_groups[head]:
print(tail, group)
if tail >= group[0] and tail <= group[1]:
in_group = True
break
elif tail > group[1] and tail == group[1] + 1:
in_group = True
group[1] += 1
break
if not in_group:
d_groups[head].append([int(tail), (tail)])
tidy_groups = []
for key, value in d_groups.items():
for group in value:
if group[0] == group[1]:
tidy_groups.append(f'{key}/{group[0]}')
else:
tidy_groups.append(f'{key}/{group[0]}-{group[1]}')
return tidy_groups
</code></pre>