使用for循环和条件来过滤列表

2024-10-02 22:33:33 发布

您现在位置:Python中文网/ 问答频道 /正文

使用Python2.7。我在列表中有以下列表:

 channels = [[ch1a.twist, ch1b.twist, ch1c.twist, ch2a.bop, ch2b.bop, ch3c.pull]]
 new_list = []

我想对我的代码应用以下逻辑:

  • 检查频道的“a”版本是否存在。如果有,则附加到新的\u列表
  • 如果“a”版本不存在,则检查频道的“b”版本并附加到新的\u列表
  • 如果“a”或“b”版本不存在,则检查频道的“c”版本并附加到新的\u列表

我想运行for循环这样

channels = [...]
new_list = []
for "blah":
   do stuff

print new_list
>> new_list = [ch1a.twist, ch2a.bop, ch3c.pull]

到目前为止我已经

 for list in channels:
    for ch in list:
        try: 
            prefix, suffix = ch.split('.')
        except ValueError:
            pass 
        else:
            if 'a' in prefix:
                new_list.append(ch)
            elif 'b' in prefix:
                new_list.append(ch)

但它仍然返回ch1a.twist和ch1b.twist…grrrrrr。我认为“elif”应该模仿下面的逻辑:“否则如果前面的条件不满足,那么执行下面的”


Tags: in版本列表newforprefixch频道
2条回答

我得到了与@roganjosh相同的错误,所以我假设您的list-within-a-list应该包含字符串(如果不包含字符串,这是一个足够简单的更改)

您提供的代码的主要问题是,如果您曾经点击代码来检查前缀中是否有“b”,那么您永远不会查看是否已经将频道号添加到new_list

我发现修改代码的最简单方法如下(虽然不太好,但我尽量保持代码不受影响):

首先,使用channels[0].sort()对列表中的列表进行排序

接下来,通过使用channelNumbers = []初始化列表来跟踪您已经添加的频道号

接下来,我拆分前缀,以便将频道号与频道版本分开:

channelNumber = prefix[:-1] channelVersion = prefix[-1:]

最后,我调整了您的elif语句,以便它们仅在尚未添加频道号的情况下添加b或c版本: elif 'b' in prefix and not channelNumber in channelNumbers:elif 'c' in prefix and not channelNumber in channelNumbers:

所以完整的代码变成:

channels = [['ch1a.twist', 'ch1b.twist', 'ch1c.twist', 'ch2a.bop', 'ch2b.bop', 'ch3c.pull']]
new_list = []
channelNumbers = []
channels[0].sort()

for list in channels:
    for ch in list:
        try:
            prefix, suffix = ch.split('.')
            channelNumber = prefix[:-1]
            channelVersion = prefix[-1:]
        except ValueError:
            pass
        else:
            if channelVersion == 'a':
                new_list.append(ch)
                channelNumbers.append(channelNumber)
            elif channelVersion == 'b' and not channelNumber in channelNumbers:
                new_list.append(ch)
            elif channelVersion == 'c' and not channelNumber in channelNumbers:
                new_list.append(ch)

print(new_list)

正如您所要求的,输出是:['ch1a.twist', 'ch2a.bop', 'ch3c.pull']

假设:

  • 您打算让ch1a.twist等成为字符串文字,但忘记了引号
  • channels只包含一个列表
  • 频道的所有版本都在列表中相邻
  • 版本是按字母顺序排列的(所以说,“ch1b”永远不会排在“ch1a”之前)

然后可以使用groupby按通道名称对项目进行分组,并使用next提取每个通道的第一个匹配项

import itertools
def channel_name(channel):
    prefix, suffix = channel.split(".")
    return prefix[:-1]
channels = [["ch1a.twist", "ch1b.twist", "ch1c.twist", "ch2a.bop", "ch2b.bop", "ch3c.pull"]]
result = [next(v) for k,v in itertools.groupby(channels[0], key=channel_name)]
print(result)

结果:

['ch1a.twist', 'ch2a.bop', 'ch3c.pull']

相关问题 更多 >