Skip to main content
 首页 » 编程设计

python之根据前缀限制列表中字符串的出现

2025年05月04日37lautakyan007

所以我正在处理的代码是针对 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