<p>有一种方法:</p>
<ol>
<li>对条目进行排序</li>
<li>确定每个条目之间公共前缀的长度</li>
<li>通过在公共前缀比前一个条目短的位置分隔列表,将条目分组</li>
</ol>
<p>实施示例:</p>
<pre><code>def common_count(t0, t1):
"returns the length of the longest common prefix"
for i, pair in enumerate(zip(t0, t1)):
if pair[0] != pair[1]:
return i
return i
def group_by_longest_prefix(iterable):
"given a sorted list of strings, group by longest common prefix"
longest = 0
out = []
for t in iterable:
if out: # if there are previous entries
# determine length of prefix in common with previous line
common = common_count(t, out[-1])
# if the current entry has a shorted prefix, output previous
# entries as a group then start a new group
if common < longest:
yield out
longest = 0
out = []
# otherwise, just update the target prefix length
else:
longest = common
# add the current entry to the group
out.append(t)
# return remaining entries as the last group
if out:
yield out
</code></pre>
<p>用法示例:</p>
^{pr2}$
<p>这会产生:</p>
<pre><code>['TOKYO-BLING.1 H02-AVAILABLE', 'TOKYO-BLING.1 H02-MIDDLING', 'TOKYO-BLING.1 H02-TOP']
['TOKYO-BLING.2 H04-AVAILABLE', 'TOKYO-BLING.2 H04-CANCELLED', 'TOKYO-BLING.2 H04-USED']
['WAY-VERING.1 H03-CANCELLED', 'WAY-VERING.1 H03-TOP']
['WAY-VERING.2 H03-AVAILABLE', 'WAY-VERING.2 H03-USED']
</code></pre>
<p>在这里看到它的作用:<a href="http://ideone.com/1Da0S" rel="nofollow">http://ideone.com/1Da0S</a></p>