所以我正在处理的代码是针对 IRC 机器人的,我想实现一种基于 CHANLIMIT 服务器选项来限制 channel 的方法。
CHANLIMIT 选项是一个限制列表,前缀和限制由 : 分隔,但如果 : 之后没有任何内容,则没有限制。
下面的解决方案有效,但我正在寻求任何改进。
result = ['#+:2', '&:']
channels = ['#test1', '#test2', '+test3', '&test4']
prefix_groups = [(prefix, []) for prefix in result]
channel_groups = {k: v for (k, v) in prefix_groups}
for channel in channels:
for group in prefix_groups:
if channel[0] in group[0]:
channel_groups[group[0]].append(channel)
break
for prefix, channels in channel_groups.items():
limit = prefix.split(':')[1]
if limit:
if len(channels) > int(limit):
channel_groups[prefix] = channels[:int(limit)]
channels = [
channel for chanlist in channel_groups.values() for channel in chanlist]
print(channels)
请您参考如下方法:
我们可以走得更远:
方案二
import itertools
results = ['#+:2', '&:']
channels_to_test = ['#test1', '#test2', '+test3', '&test4',
'#test5', '!test5', '&test6', '&test7',
'+test8', '#test9']
channel_groups = {group: [channel for channel in channels_to_test
if channel[0] in group]
for group in results}
limit = lambda prefix: prefix.split(':')[1]
modified_channel_groups = {prefix: channels[:int(limit(prefix))]
for (prefix, channels) in channel_groups.items()
if limit(prefix)}
channel_groups.update(modified_channel_groups)
result_channels = list(itertools.chain.from_iterable(channel_groups.values()))
print(result_channels)
但在这里我必须做一个假设:我假设一个 channel 最多可以匹配results的一个元素。换句话说,results 的任何两个元素都不会匹配同一个 channel 。告诉我这是否不适合您的情况。
以下是我所做的更改:
- 我使用字典理解创建了
channel_groups,其中每个元素的值都是列表理解 - 我创建了
modified_channel_groups,其中包含已缩短的channel_groups元素 - 我 updated
channel_groups的元素与modified_channel_groups 的元素
- 我创建了一个 lambda expression这样我就可以将它包含在
modified_channel_groups的定义中。 - 我已经使用
itertools.chain.from_iterable()提取了result_channels
