擅长:python、mysql、java
<p>您可以使用<a href="https://docs.python.org/3/library/itertools.html#itertools.groupby" rel="nofollow">^{<cd1>}</a>按相同的IP地址分组:</p>
<pre><code>data = {'ip1:port1' : "value1", 'ip1:port2' : "value2", 'ip2:port1' : "value3", 'ip2:port2': "value4"}
by_ip = {k: list(g) for k, g in itertools.groupby(sorted(data), key=lambda s: s.split(":")[0])}
by_ip
# {'ip1': ['ip1:port1', 'ip1:port2'], 'ip2': ['ip2:port1', 'ip2:port2']}
</code></pre>
<p>从不同的组中选择一个IP。在</p>
^{pr2}$
<p>或者更短,为组中的第一个键生成生成器表达式:</p>
<pre><code>one_by_ip = (next(g) for k, g in itertools.groupby(sorted(data), key=lambda s: s.split(":")[0]))
{key: data[key] for key in one_by_ip}
# {'ip1:port1': 'value1', 'ip2:port1': 'value3'}
</code></pre>
<p>但是,请注意,<code>groupby</code>需要对输入数据进行排序。因此,如果您想避免对dict中的所有键进行排序,那么您应该只使用一个<code>set</code>已经看到的键。在</p>
<pre><code>seen = set()
not_seen = lambda x: not(x in seen or seen.add(x))
{key: data[key] for key in data if not_seen(key.split(":")[0])}
# {'ip1:port1': 'value1', 'ip2:port1': 'value3'}
</code></pre>
<p>这与您的解决方案类似,但不是循环唯一的键并在dict中为每个键找到匹配的键,而是循环键并检查是否已经看到了IP。在</p>