使用Python2.7。我在列表中有以下列表:
channels = [[ch1a.twist, ch1b.twist, ch1c.twist, ch2a.bop, ch2b.bop, ch3c.pull]]
new_list = []
我想对我的代码应用以下逻辑:
我想运行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”应该模仿下面的逻辑:“否则如果前面的条件不满足,那么执行下面的”
我得到了与@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:
所以完整的代码变成:
正如您所要求的,输出是:
['ch1a.twist', 'ch2a.bop', 'ch3c.pull']
假设:
ch1a.twist
等成为字符串文字,但忘记了引号channels
只包含一个列表然后可以使用
groupby
按通道名称对项目进行分组,并使用next
提取每个通道的第一个匹配项结果:
相关问题 更多 >
编程相关推荐